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


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.