Jak usunąć wszystkie początkowe spacje z ciągu? - szybki

170

Potrzebuję sposobu na usunięcie pierwszego znaku z łańcucha, którym jest spacja. Szukam metody lub nawet rozszerzenia dla typu String, którego mogę użyć do wycięcia znaku ciągu.

dhruvm
źródło
8
Czy chcesz usunąć pierwszy znak spacji czy wszystkie znaki spacji w ciągu?
Alex
1
Możliwy duplikat: usuń zestaw białych znaków z ciągu bez spacji .
Imanou Petit

Odpowiedzi:

380

Aby usunąć wiodące i końcowe spacje:

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

Swift 3 / Swift 4:

let trimmedString = string.trimmingCharacters(in: .whitespaces)
Alex
źródło
180
będzie to działać tylko dla początkowych i końcowych białych znaków. nie usunie to białych znaków zawartych w łańcuchu.
niedziela
87
jeśli chcesz usunąć wszystkie spacje, możesz spróbować myString.stringByReplacingOccurrencesOfString ("", withString: "")
Lucas
6
Możesz również użyć, NSCharacterSet.whitespaceAndNewlineCharacterSet()jeśli chcesz również przyciąć znaki nowej linii.
Blip
2
Aby działał ze Swift 3.0, a także usuwał spacje między ciągami, użyj odpowiedzi: stackoverflow.com/a/39067610/4886069
2
Użytkownik Swift 3+: yourString.replacingOccurrences (z: "", z: "")
Nadeesha Lakmal
144

Prawidłowy sposób usuwania wszystkich rodzajów białych znaków (w oparciu o tę odpowiedź SO ) to:

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

EDYTOWAĆ

Ta odpowiedź została opublikowana, gdy pytanie dotyczyło usunięcia wszystkich białych znaków, pytanie zostało zmienione, aby wspomnieć tylko o wiodących białych znakach. Jeśli chcesz usunąć tylko wiodące spacje, użyj następujących poleceń:

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
źródło
5
także .components (SeparatedBy: .whitespacesAndNewlines) również dla nowych linii
Derek
To powinno być func, a nie var
Jakub Truhlář
1
Ze względu na logikę funkcji . Tworzysz obliczoną właściwość, kiedy powinieneś utworzyć funkcję . Robi coś, a nie trzyma wartość lub oblicza ją na podstawie innej. Zobacz: stackoverflow.com/questions/24035276/…
Jakub Truhlář
4
@ JakubTruhlář - To kwestia opinii, a nie stwierdzenia faktu. Zobacz softwareengineering.stackexchange.com/questions/304077/…
Ashley Mills
1
@ JakubTruhlář Mówisz "To powinno być func, a nie var" - to brzmi tak, jakbyś stwierdzał fakt, a nie swoją opinię. Jeśli przeczytasz odpowiedzi na powiązane pytanie, zobaczysz, że chociaż „ma to sens” dla Ciebie, dla innych osób… niekoniecznie.
Ashley Mills
82

To rozszerzenie typu String usuwa wszystkie białe znaki z ciągu, a nie tylko końcowe spacje ...

 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: "")
    }
  }

Przykład:

let string = "The quick brown dog jumps over the foxy lady."
let result = string.removeWhitespace() // Thequickbrowndogjumpsoverthefoxylady.
BadmintonCat
źródło
4
Działa tylko dla „” (nie uwzględnia innych rodzajów whitesapce)
fpg1503
@ fpg1503 jakie inne rodzaje białych znaków?
Ricardo
Te zdefiniowane w kategorii Zs: fileformat.info/info/unicode/category/Zs/list.htm
fpg1503
45

Szybki 3

Możesz po prostu użyć tej metody, aby usunąć wszystkie normalne spacje w ciągu (nie uwzględnia wszystkich typów białych znaków):

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

Rezultatem będzie:

HelloWorld!
Mykyta Savchuk
źródło
1
Działa tylko dla „” (nie uwzględnia innych rodzajów whitesapce)
fpg1503
@Greg nadal brakuje 16 innych znaków: fileformat.info/info/unicode/category/Zs/list.htm
fpg1503
18

Możesz też użyć wyrażenia regularnego.

let trimmedString = myString.stringByReplacingOccurrencesOfString("\\s", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
mohonish
źródło
Swift 4: myString.replacingOccurrences (of: "\\ s", with: "", options: NSString.CompareOptions.regularExpression, range: nil)
norbDEV
16

W przypadku Swift 3.0+ zobacz inne odpowiedzi. To jest teraz starsza odpowiedź dla Swift 2.x

Zgodnie z powyższą odpowiedzią, ponieważ jesteś zainteresowany usunięciem pierwszego znaku, metoda instancji .stringByTrimmingCharactersInSet () będzie dobrze działać:

myString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

Możesz także tworzyć własne zestawy znaków, aby przycinać granice swoich ciągów, np .:

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

Istnieje również wbudowana metoda instancji, która radzi sobie z usuwaniem lub zastępowaniem podciągów o nazwie stringByReplacingOccurrencesOfString (target: String, replace: String) . Może usuwać spacje lub inne wzorce, które występują w dowolnym miejscu w ciągu

Możesz określić opcje i zakresy, ale nie musisz:

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

Jest to łatwy sposób na usunięcie lub zamianę dowolnego powtarzającego się wzoru znaków w ciągu i można go połączyć, chociaż za każdym razem musi przejść przez cały ciąg, zmniejszając wydajność. Więc możesz to zrobić:

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

... ale potrwa to dwa razy dłużej.

.stringByReplacingOccurrencesOfString () dokumentacja z witryny Apple

Tworzenie łańcuchów tych metod instancji typu String może być czasami bardzo wygodne w przypadku jednorazowych konwersji, na przykład, jeśli chcesz przekonwertować krótki obiekt BLOB NSData na ciąg szesnastkowy bez spacji w jednej linii, możesz to zrobić za pomocą wbudowanej interpolacji ciągów języka Swift oraz przycinania i wymiana:

("\(myNSDataBlob)").stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")).stringByReplacingOccurrencesOfString(" ", withString: "")
Woda nie słowa
źródło
Działa tylko dla „” (nie uwzględnia innych rodzajów whitesapce)
fpg1503
Wciąż nie bierze pod uwagę innych rodzajów białych znaków w środku łańcucha
fpg1503
12

Dla Swift 3.0

import Foundation

var str = " Hear me calling"

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

str.stringByRemovingWhitespaces  // Hearmecalling
Dharmesh Kheni
źródło
8

Szybki 4

Doskonały przypadek użycia wyrażenia regularnego:

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

// thisiswrongcontainedteeext
dimpiax
źródło
7

Użyłbym tego rozszerzenia, aby być elastycznym i naśladować sposób, w jaki robią to inne kolekcje:

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"
Jean-Philippe Pellet
źródło
Działa tylko dla „” (nie uwzględnia innych rodzajów whitesapce)
fpg1503
6

Jeśli chcesz usunąć spacje z przodu (iz tyłu), ale nie ze środka, użyj stringByTrimmingCharactersInSet

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

Jeśli chcesz usunąć spacje z dowolnego miejsca w ciągu, możesz spojrzeć na stringByReplacing ...

Jeremy Pope
źródło
Jak usunąć również środkową przestrzeń?
Nikhil Gupta
@NikhilGupta no, tylko początek i koniec (przykładowe dane " First Word "wyjściowe "First Word").
fpg1503
6

Swift 4, 4,2 i 5

Usuń przestrzeń tylko z przodu i z końca

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

Usuń spacje z każdego miejsca w ciągu

let stringWithSpaces = " The Akbar khan code "
let stringWithoutSpaces = stringWithSpaces.replacingOccurrences(of: " ", with: "")
Akbar Khan
źródło
3

Możesz też tego spróbować

   let updatedString = searchedText?.stringByReplacingOccurrencesOfString(" ", withString: "-")
Avinash Mishra
źródło
Działa tylko dla „” (nie uwzględnia innych rodzajów whitesapce)
fpg1503
3

Wypróbuj programowanie funkcjonalne, aby usunąć spacje:

extension String {
  func whiteSpacesRemoved() -> String {
    return self.filter { $0 != Character(" ") }
  }
}
Yi Gu
źródło
3
extension String {

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

    func removing(_ forbiddenCharacters: CharacterSet) -> String {
        return String(unicodeScalars.filter({ !forbiddenCharacters.contains($0) }))
    }
}
Oliver Pearmain
źródło
3

Jeśli ktoś usunie dodatkową spację ze stringa np. = "This is the demo text remove extra space between the words."

Możesz użyć tej funkcji w 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
}

a wynik będzie

"This is the demo text remove extra space between the words."
Gurinder Batth
źródło
3

Cześć, to może być późno, ale warto spróbować. To pochodzi z pliku placu zabaw. Możesz uczynić z niego rozszerzenie typu String.

Jest to napisane w języku Swift 5.3

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

Metoda 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
źródło
To jest dla Swift 5.x
Kyle Emmanuel
To jest świetne! Dzięki
RJ Uy
2

Wersja 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
źródło
2

Przycinanie białych spacji w Swift 4

let strFirstName = txtFirstName.text?.trimmingCharacters(in: 
 CharacterSet.whitespaces)
Mahesh Chaudhari
źródło
2

Jeszcze inna odpowiedź, czasami ciąg wejściowy może zawierać więcej niż jedną spację między słowami. Jeśli chcesz ustandaryzować, aby między słowami było tylko 1 odstęp, spróbuj tego (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-Hoa
źródło
1

U mnie następująca linia służyła do usuwania białych znaków.

let result = String(yourString.filter {![" ", "\t", "\n"].contains($0)})
ssowri1
źródło
1
string = string.filter ({!" ".contains($0) })
Fahim Rahman
źródło
-1

Wersja Swift 3 odpowiedzi 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: "")
    }
}
grube
źródło
Działa tylko dla „” (nie uwzględnia innych rodzajów whitesapce)
fpg1503
Ponieważ twoja odpowiedź jest błędna. Odpowiedź, którą podałeś aktualizację, również jest błędna. Istnieje kilka rodzajów białych znaków i dlatego whitespaceCharacterSetnajlepiej jest ich używać.
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)
    }
}
Rakesh Vaniyen
źródło
-2

Aby usunąć wszystkie spacje z ciągu:

let space_removed_string = (yourstring?.components(separatedBy: " ").joined(separator: ""))!
Ram Madhavan
źródło