Як слід видалити всі провідні пробіли з рядка? - стрімкий


170

Мені потрібен спосіб видалити перший символ із рядка, який є пробілом. Я шукаю метод або навіть розширення для типу String, який я можу використовувати для вирізання символу рядка.


8
Ви хочете видалити перший символ пробілу або всі символи пробілу в рядку?
Олексій

Відповіді:


380

Щоб видалити провідні та кінцеві пробіли:

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

Swift 3 / Swift 4:

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

180
це буде працювати лише для провідних та кінцевих пробілів. це не видалить пробіли, що містяться в рядку.
сонце

87
якщо ви хочете видалити всі порожні пробіли, ви можете спробувати myString.stringByReplacingOccurrencesOfString ("", withString: "")
Лукас

6
Ви також можете використовувати, NSCharacterSet.whitespaceAndNewlineCharacterSet()якщо ви хочете також обрізати символи нового рядка.
Бліп

2
Для того, щоб змусити його працювати з Swift 3.0 , а також видалити пробіли між рядків використовуйте відповідь: stackoverflow.com/a/39067610/4886069

2
Користувач Swift 3+: yourString.replacingOccurrences (of: "", with: "")
Nadeesha Lakmal

144

Правильний спосіб, коли ви хочете видалити всі види пробілів (на основі цієї відповіді ТА ):

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()
    }
}

EDIT

Ця відповідь була розміщена, коли питання стосувалося видалення всіх пробілів, питання було відредаговано, щоб згадати лише провідні пробіли. Якщо ви хочете видалити лише провідні пробіли, скористайтеся наступним:

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
також .компоненти (розділеніBy: .whitespacesAndNewlines) і для нових рядків
Derek

Це має бути функція не вар
Якуб Труларж

1
Через логіку функції . Ви створюєте обчислене властивість, коли слід робити функцію . Він робить smt, а не утримує значення або обчислює його з іншого. Подивіться: stackoverflow.com/questions/24035276 / ...
Якуб Truhlář

4
@ JakubTruhlář - Це питання думки, а не констатація факту. Дивіться softwareengineering.stackexchange.com/questions/304077/…
Ashley Mills

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
Працює лише для "" (не враховує інших видів пробілів)
fpg1503

@ fpg1503 які ще види пробілів?
Рікардо

Визначені для категорії Zs:
fileformat.info/info/unicode/category/Zs/list.htm

45

Швидкий 3

Ви можете просто використовувати цей метод для видалення всіх звичайних пробілів у рядку (не враховує всі типи пробілів):

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

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

HelloWorld!

1
Працює лише для "" (не враховує інших видів пробілів)
fpg1503

@Greg ви все ще НЕ вистачає 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.replacingOccurrences (of: "\\ s", with: "", options: NSString.CompareOptions.regularExpression, range: nil)
norbDEV

16

Для Swift 3.0+ див. Інші відповіді. Це тепер застаріла відповідь для Swift 2.x

Як відповів вище, оскільки вам цікаво видалити перший символ, метод примірника .stringByTrimmingCharactersInSet () буде добре працювати:

myString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

Ви також можете зробити власні набори символів, щоб обрізати межі ваших рядків, наприклад:

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

Існує також вбудований метод екземпляра для усунення або заміни підрядків під назвою stringByReplacingOccurrencesOfString (target: String, substitution: String) . Це може видалити пробіли або будь-які інші візерунки, які виникають у будь-якому місці вашої рядка

Ви можете вказати параметри та діапазони, але не потрібно:

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

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

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

... але це займе вдвічі більше.

.stringByReplacingOccurrencesOfString () документація з сайту Apple

Зв’язування цих методів String-екземпляра іноді може бути дуже зручним для одноразових перетворень, наприклад, якщо ви хочете перетворити короткий рядок NSData в шістнадцяткову рядок без пробілів в одному рядку, ви можете зробити це за допомогою вбудованої Swift в інтерполяції String та деякої обрізки та заміна:

("\(myNSDataBlob)").stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")).stringByReplacingOccurrencesOfString(" ", withString: "")

Працює лише для "" (не враховує інших видів пробілів)
fpg1503

Він досі не враховує інших видів пробілів посеред струни
fpg1503

12

Для швидкого 3.0

import Foundation

var str = " Hear me calling"

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

str.stringByRemovingWhitespaces  // Hearmecalling

8

Швидкий 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"

Працює лише для "" (не враховує інших видів пробілів)
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: "-")

Працює лише для "" (не враховує інших видів пробілів)
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

Ще одна відповідь: іноді рядок введення може містити більше одного пробілу між словами. Якщо вам потрібно стандартизувати лише один пробіл між словами, спробуйте це (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: "")
    }
}

Працює лише для "" (не враховує інших видів пробілів)
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.