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


170

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


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

Ответы:


380

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

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

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

let trimmedString = string.trimmingCharacters(in: .whitespaces)

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...])
    }
}

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.

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)

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

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       "

Это для 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)
        }


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 !"

1

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

let result = String(yourString.filter {![" ", "\t", "\n"].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: "")
    }
}

Работает только для "" (не учитывает другие виды 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: ""))!
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.