Как мне удалить все начальные пробелы из строки? - быстро

170

Мне нужен способ удалить первый символ из строки, которая является пробелом. Я ищу метод или даже расширение для типа String, которое я могу использовать, чтобы вырезать символ строки.

dhruvm
источник
8
Вы хотите удалить первый пробел или все пробелы в строке?
Алекс

Ответы:

380

Чтобы удалить начальные и конечные пробелы:

let trimmedString = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

Свифт 3 / Свифт 4:

let trimmedString = string.trimmingCharacters(in: .whitespaces)
Alex
источник
180
это будет работать только для начальных и конечных пробелов. это не удалит пробелы, содержащиеся в строке.
вс
87
если вы хотите удалить все пробелы, вы можете попробовать myString.stringByReplacingOccurferencesOfString ("", withString: "")
Лукас
6
Вы также можете использовать, NSCharacterSet.whitespaceAndNewlineCharacterSet()если вы хотите обрезать символы новой строки.
Blip
2
Чтобы заставить его работать со Swift 3.0, а также удалить пробелы между строками, используйте ответ: stackoverflow.com/a/39067610/4886069
2
Swift 3+ пользователь: yourString.replacingOccurferences (из: "", с: "")
Надеша Лакмаль
144

Правильный способ удаления всевозможных пробелов (на основе этого ответа SO ):

extension String {
    var stringByRemovingWhitespaces: String {
        let components = componentsSeparatedByCharactersInSet(.whitespaceCharacterSet())
        return components.joinWithSeparator("")
    }
}

Swift 3.0+ (3.0, 3.1, 3.2, 4.0)

extension String {
    func removingWhitespaces() -> String {
        return components(separatedBy: .whitespaces).joined()
    }
}

РЕДАКТИРОВАТЬ

Этот ответ был опубликован, когда вопрос касался удаления всех пробелов, вопрос был отредактирован так, чтобы упоминать только ведущие пробелы. Если вы хотите удалить только первые пробелы, используйте следующее:

extension String {
    func removingLeadingSpaces() -> String {
        guard let index = firstIndex(where: { !CharacterSet(charactersIn: String($0)).isSubset(of: .whitespaces) }) else {
            return self
        }
        return String(self[index...])
    }
}
fpg1503
источник
5
также .components (separaBy: .whitespacesAndNewlines) также для новых строк
Дерек
Это должен быть функционал, а не вар
Якуб Трухларж
1
Из-за логики функции . Вы делаете вычисляемое свойство, когда вы должны сделать функцию . Это делает smt, а не удерживает значение или вычисляет его из другого. Посмотрите на: stackoverflow.com/questions/24035276/…
Якуб Трухлар
4
@ JakubTruhlář - Это вопрос мнения, а не констатация факта. См. Softwareengineering.stackexchange.com/questions/304077/…
Эшли Миллс,
1
@ JakubTruhlář Вы говорите: «Это должен быть функционал, а не вар» - это звучит очень похоже на то, что вы констатируете факт, а не ваше мнение. Если вы прочитаете ответы на связанный вопрос, вы увидите, что, хотя он «имеет смысл» для вас, для других людей… не обязательно.
Эшли Миллс
82

Это расширение String удаляет все пробелы из строки, а не только конечные пробелы ...

 extension String {
    func replace(string:String, replacement:String) -> String {
        return self.replacingOccurrences(of: string, with: replacement, options: NSString.CompareOptions.literal, range: nil)
    }

    func removeWhitespace() -> String {
        return self.replace(string: " ", replacement: "")
    }
  }

Пример:

let string = "The quick brown dog jumps over the foxy lady."
let result = string.removeWhitespace() // Thequickbrowndogjumpsoverthefoxylady.
BadmintonCat
источник
4
Работает только для "" (не учитывает другие виды whitesapce)
fpg1503
@ fpg1503 какие еще виды пробелов?
Рикардо
Те, которые определены в категории Zs: fileformat.info/info/unicode/category/Zs/list.htm
fpg1503
45

Swift 3

Вы можете просто использовать этот метод для удаления всех обычных пробелов в строке (не учитывает все типы пробелов):

let myString = " Hello World ! "
let formattedString = myString.replacingOccurrences(of: " ", with: "")

Результат будет:

HelloWorld!
Никита Савчук
источник
1
Работает только для "" (не учитывает другие виды whitesapce)
fpg1503
@ Грег, тебе все еще не хватает 16 других символов: fileformat.info/info/unicode/category/Zs/list.htm
fpg1503
18

Вы также можете использовать регулярные выражения.

let trimmedString = myString.stringByReplacingOccurrencesOfString("\\s", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
mohonish
источник
Swift 4: myString.replacingOccurferences (из: "\\ s", с: "", опции: NSString.CompareOptions.regularExpression, диапазон: ноль)
norbDEV
16

Для Swift 3.0+ смотрите другие ответы. Теперь это унаследованный ответ для Swift 2.x

Как уже было сказано выше, поскольку вы заинтересованы в удалении первого символа, метод экземпляра .stringByTrimmingCharactersInSet () будет работать хорошо:

myString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

Вы также можете создавать свои собственные наборы символов, чтобы обрезать границы ваших строк, например:

myString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>"))

Существует также встроенный метод экземпляра для удаления или замены подстрок, называемый stringByReplacingOccurferencesOfString (target: String, replace: String) . Он может удалить пробелы или любые другие шаблоны, которые встречаются в любом месте вашей строки

Вы можете указать параметры и диапазоны, но не нужно:

myString.stringByReplacingOccurrencesOfString(" ", withString: "")

Это простой способ удалить или заменить любой повторяющийся набор символов в вашей строке, и его можно объединить в цепочку, хотя каждый раз, когда он проходит через него, приходится проходить еще раз через всю строку, что снижает эффективность. Так что вы можете сделать это:

 myString.stringByReplacingOccurrencesOfString(" ", withString: "").stringByReplacingOccurrencesOfString(",", withString: "")

... но это займет вдвое больше времени.

Документация .stringByReplacingOccursionsOfString () с сайта Apple

Цепочка этих методов экземпляра String иногда может быть очень удобной для однократных преобразований, например, если вы хотите преобразовать короткий BLOB-объект NSData в шестнадцатеричную строку без пробелов в одной строке, вы можете сделать это с помощью встроенной в Swift интерполяции String и некоторой обрезки и замена:

("\(myNSDataBlob)").stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")).stringByReplacingOccurrencesOfString(" ", withString: "")
Вода не слова
источник
Работает только для "" (не учитывает другие виды whitesapce)
fpg1503
Он по-прежнему не учитывает другие виды пробелов в середине строки
fpg1503
12

Для Swift 3.0

import Foundation

var str = " Hear me calling"

extension String {
    var stringByRemovingWhitespaces: String {
        return components(separatedBy: .whitespaces).joined()
    }
}

str.stringByRemovingWhitespaces  // Hearmecalling
Дхармеш Хени
источник
8

Swift 4

Отличный случай, чтобы использовать регулярное выражение:

" this is    wrong contained teee xt     "
    .replacingOccurrences(of: "^\\s+|\\s+|\\s+$", 
                          with: "", 
                          options: .regularExpression)

// thisiswrongcontainedteeext
dimpiax
источник
7

Я бы использовал это расширение, чтобы быть гибким и подражать тому, как это делают другие коллекции:

extension String {
    func filter(pred: Character -> Bool) -> String {
        var res = String()
        for c in self.characters {
            if pred(c) {
                res.append(c)
            }
        }
        return res
    }
}

"this is a String".filter { $0 != Character(" ") } // "thisisaString"
Жан-Филипп Пелле
источник
Работает только для "" (не учитывает другие виды whitesapce)
fpg1503
6

Если вы хотите удалить пробелы спереди (и сзади), но не посередине, вы должны использовать stringByTrimmingCharactersInSet

    let dirtyString   = " First Word "
    let cleanString = dirtyString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

Если вы хотите удалить пробелы в любом месте строки, вы можете посмотреть на stringByReplacing ...

Джереми Папа
источник
Как убрать среднее пространство?
Нихил Гупта
@NikhilGupta нет, только ведущий и конечный (пример " First Word "выходных данных "First Word").
fpg1503
6

Свифт 4, 4.2 и 5

Удалить пространство только спереди и сзади

let str = "  Akbar Code  "
let trimmedString = str.trimmingCharacters(in: .whitespacesAndNewlines)

Удалить пробелы из любого места в строке

let stringWithSpaces = " The Akbar khan code "
let stringWithoutSpaces = stringWithSpaces.replacingOccurrences(of: " ", with: "")
Акбар Хан
источник
3

Вы также можете попробовать это

   let updatedString = searchedText?.stringByReplacingOccurrencesOfString(" ", withString: "-")
Авинаш Мишра
источник
Работает только для "" (не учитывает другие виды whitesapce)
fpg1503
3

Попробуйте функциональное программирование, чтобы удалить пробелы:

extension String {
  func whiteSpacesRemoved() -> String {
    return self.filter { $0 != Character(" ") }
  }
}
И Гу
источник
3
extension String {

    var removingWhitespaceAndNewLines: String {
        return removing(.whitespacesAndNewlines)
    }

    func removing(_ forbiddenCharacters: CharacterSet) -> String {
        return String(unicodeScalars.filter({ !forbiddenCharacters.contains($0) }))
    }
}
Оливер Пирмейн
источник
3

Если кто-нибудь удаляет лишний пробел из строки, например, = "This is the demo text remove extra space between the words."

Вы можете использовать эту функцию в Swift 4.

func removeSpace(_ string: String) -> String{
    var str: String = String(string[string.startIndex])
    for (index,value) in string.enumerated(){
        if index > 0{
            let indexBefore = string.index(before: String.Index.init(encodedOffset: index))
            if value == " " && string[indexBefore] == " "{
            }else{
                str.append(value)
            }
        }
    }
    return str
}

и результат будет

"This is the demo text remove extra space between the words."
Гуриндер Батт
источник
3

Привет, это может быть поздно, но стоит попробовать. Это из файла детской площадки. Вы можете сделать это расширением String.

Это написано в Swift 5.3

Способ 1:

var str = "\n \tHello, playground       "
if let regexp = try? NSRegularExpression(pattern: "^\\s+", options: NSRegularExpression.Options.caseInsensitive) {
    let mstr = NSMutableString(string: str)
    regexp.replaceMatches(in: mstr, options: [], range: NSRange(location: 0, length: str.count), withTemplate: "")
    str = mstr as String
}

Result: "Hello, playground       "

Способ 2:

if let c = (str.first { !($0 == " " || $0 == "\t" || $0 == "\n") }) {
    if let nonWhiteSpaceIndex = str.firstIndex(of: c) {
        str.replaceSubrange(str.startIndex ..< nonWhiteSpaceIndex, with: "")
    }
}

Result: "Hello, playground       "
lexlab
источник
Это для Swift 5.x
Кайл Эммануэль
Это круто! Спасибо
RJ Uy
2

Версия Swift 3

  //This function trim only white space:
   func trim() -> String
        {
            return self.trimmingCharacters(in: CharacterSet.whitespaces)
        }
    //This function trim whitespeaces and new line that you enter:
     func trimWhiteSpaceAndNewLine() -> String
        {
            return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
        }
NemSothea
источник
2

Обрезка пробелов в Свифт 4

let strFirstName = txtFirstName.text?.trimmingCharacters(in: 
 CharacterSet.whitespaces)
Махеш Чаудхари
источник
2

Еще один ответ, иногда входная строка может содержать более одного пробела между словами. Если вам нужно стандартизировать, чтобы между словами было только 1 пробел, попробуйте это (Swift 4/5)

let inputString = "  a very     strange   text !    "
let validInput = inputString.components(separatedBy:.whitespacesAndNewlines).filter { $0.count > 0 }.joined(separator: " ")

print(validInput) // "a very strange text !"
Duyen-Хоа
источник
1

Для меня следующая строка используется для удаления пробелов.

let result = String(yourString.filter {![" ", "\t", "\n"].contains($0)})
ssowri1
источник
1
string = string.filter ({!" ".contains($0) })
Фахим Рахман
источник
-1

Swift 3 версия ответа BadmintonCat

extension String {
    func replace(_ string:String, replacement:String) -> String {
        return self.replacingOccurrences(of: string, with: replacement, options: NSString.CompareOptions.literal, range: nil)
    }

    func removeWhitespace() -> String {
        return self.replace(" ", replacement: "")
    }
}
adougies
источник
Работает только для "" (не учитывает другие виды whitesapce)
fpg1503
Потому что ваш ответ неверен. Ответ, на который вы предоставили обновление, также неверен. Есть несколько видов пробелов, и поэтому использование whitespaceCharacterSet- это лучшая практика.
fpg1503
-1
class SpaceRemover
{
    func SpaceRemover(str :String)->String
    {
        var array = Array(str)
        var i = array.count
        while(array.last == " ")
        {
            var array1 = [Character]()
            for item in  0...i - 1
            {
                array1.append(array[item])
            }
            i = i - 1
            array = array1
            print(array1)
            print(array)

        }

        var arraySecond = array
        var j = arraySecond.count

        while(arraySecond.first == " ")
        {
            var array2 = [Character]()
            if j > 1
            {
                for item in 1..<j
                {
                    array2.append(arraySecond[item])
                }
            }
            j = j - 1
            arraySecond = array2
            print(array2)
            print(arraySecond)

        }
        print(arraySecond)
        return String(arraySecond)
    }
}
Ракеш Ваниен
источник
-2

Чтобы удалить все пробелы из строки:

let space_removed_string = (yourstring?.components(separatedBy: " ").joined(separator: ""))!
Рам Мадхаван
источник