Wie soll ich alle führenden Leerzeichen aus einer Zeichenfolge entfernen? - schnell


170

Ich brauche eine Möglichkeit, das erste Zeichen aus einer Zeichenfolge zu entfernen, die ein Leerzeichen ist. Ich suche nach einer Methode oder sogar einer Erweiterung für den String-Typ, mit der ich ein Zeichen eines Strings ausschneiden kann.


8
Möchten Sie das erste Leerzeichen oder alle Leerzeichen in der Zeichenfolge entfernen ?
Alex

Antworten:


380

So entfernen Sie führende und nachfolgende Leerzeichen:

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

Swift 3 / Swift 4:

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

180
Dies funktioniert nur für führende und nachfolgende Leerzeichen. Dadurch werden die in der Zeichenfolge enthaltenen Leerzeichen nicht entfernt.
Sonne

87
Wenn Sie alle Leerzeichen entfernen möchten, können Sie myString.stringByReplacingOccurrencesOfString ("", withString: "")
Lucas

6
Sie können auch verwenden, NSCharacterSet.whitespaceAndNewlineCharacterSet()wenn Sie auch Zeilenumbrüche schneiden möchten.
Blip

2
Verwenden Sie die Antwort: stackoverflow.com/a/39067610/4886069

2
Swift 3+ Benutzer: yourString.replacingOccurrences (von: "", mit: "")
Nadeesha Lakmal

144

Der richtige Weg, wenn Sie alle Arten von Leerzeichen entfernen möchten (basierend auf dieser SO-Antwort ), ist:

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

BEARBEITEN

Diese Antwort wurde veröffentlicht, als es um das Entfernen aller Leerzeichen ging. Die Frage wurde bearbeitet, um nur führende Leerzeichen zu erwähnen. Wenn Sie nur führende Leerzeichen entfernen möchten, verwenden Sie Folgendes:

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
auch .components (getrennt durch: .whitespacesAndNewlines) auch für neue Zeilen
Derek

Dies sollte eine Funktion sein, keine Var
Jakub Truhlář

1
Wegen der Logik der Funktion . Sie erstellen eine berechnete Eigenschaft, wenn Sie eine Funktion erstellen sollen . Es macht eher smt als einen Wert zu halten oder ihn aus einem anderen zu berechnen. Schauen Sie sich an: stackoverflow.com/questions/24035276/…
Jakub Truhlář

4
@ JakubTruhlář - Das ist eine Ansichtssache, keine Tatsachenfeststellung. Siehe softwareengineering.stackexchange.com/questions/304077/…
Ashley Mills

1
@ JakubTruhlář Du sagst "Dies sollte eine Funktion sein, keine Var" - das klingt sehr danach, als würdest du eine Tatsache angeben, nicht deine Meinung. Wenn Sie die Antworten auf die verknüpfte Frage lesen, werden Sie feststellen, dass dies für Sie "Sinn macht", für andere Menschen jedoch nicht unbedingt.
Ashley Mills

82

Diese String-Erweiterung entfernt alle Leerzeichen aus einem String, nicht nur nachgestellte Leerzeichen ...

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

Beispiel:

let string = "The quick brown dog jumps over the foxy lady."
let result = string.removeWhitespace() // Thequickbrowndogjumpsoverthefoxylady.

4
Funktioniert nur für "" (berücksichtigt keine anderen Arten von Whitesapce)
fpg1503

@ fpg1503 welche anderen Arten von Leerzeichen?
Ricardo

Die in der Kategorie Zs definierten: fileformat.info/info/unicode/category/Zs/list.htm
fpg1503

45

Swift 3

Mit dieser Methode können Sie einfach alle normalen Leerzeichen in einer Zeichenfolge entfernen (berücksichtigt nicht alle Arten von Leerzeichen):

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

Das Ergebnis wird sein:

HelloWorld!

1
Funktioniert nur für "" (berücksichtigt keine anderen Arten von Whitesapce)
fpg1503

@ Greg Sie vermissen noch 16 andere Zeichen: fileformat.info/info/unicode/category/Zs/list.htm
fpg1503

18

Sie können auch Regex verwenden.

let trimmedString = myString.stringByReplacingOccurrencesOfString("\\s", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)

Swift 4: myString.replacingOccurrences (von: "\\ s", mit: "", Optionen: NSString.CompareOptions.regularExpression, Bereich: nil)
norbDEV

16

Für Swift 3.0+ siehe die anderen Antworten. Dies ist jetzt eine Legacy-Antwort für Swift 2.x.

Wie oben beantwortet, funktioniert die Instanzmethode .stringByTrimmingCharactersInSet () gut , da Sie das erste Zeichen entfernen möchten :

myString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

Sie können auch eigene Zeichensätze erstellen, um die Grenzen Ihrer Zeichenfolgen zu verringern, z.

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

Es gibt auch eine integrierte Instanzmethode zum Entfernen oder Ersetzen von Teilzeichenfolgen mit dem Namen stringByReplacingOccurrencesOfString (Ziel: String, Ersetzung: String) . Es kann Leerzeichen oder andere Muster entfernen, die an einer beliebigen Stelle in Ihrer Zeichenfolge auftreten

Sie können Optionen und Bereiche angeben, müssen jedoch nicht:

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

Dies ist eine einfache Möglichkeit, sich wiederholende Zeichenmuster in Ihrer Zeichenfolge zu entfernen oder zu ersetzen. Sie kann verkettet werden, obwohl jedes Mal ein weiterer Durchlauf durch die gesamte Zeichenfolge erforderlich ist, wodurch die Effizienz verringert wird. So können Sie Folgendes tun:

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

... aber es wird doppelt so lange dauern.

.stringByReplacingOccurrencesOfString () -Dokumentation von der Apple-Site

Das Verketten dieser String-Instanzmethoden kann manchmal für einmalige Konvertierungen sehr praktisch sein. Wenn Sie beispielsweise einen kurzen NSData-Blob in einen Hex-String ohne Leerzeichen in einer Zeile konvertieren möchten, können Sie dies mit Swifts integrierter String-Interpolation und etwas Trimmen und tun Ersetzen:

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

Funktioniert nur für "" (berücksichtigt keine anderen Arten von Whitesapce)
fpg1503

Andere Arten von Leerzeichen in der Mitte des
Strings werden

12

Für schnelle 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

Der ausgezeichnete Fall, um den regulären Ausdruck zu verwenden:

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

// thisiswrongcontainedteeext

7

Ich würde diese Erweiterung verwenden, um flexibel zu sein und nachzuahmen, wie andere Sammlungen dies tun:

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"

Funktioniert nur für "" (berücksichtigt keine anderen Arten von Whitesapce)
fpg1503

6

Wenn Sie Leerzeichen von vorne (und hinten), aber nicht von der Mitte entfernen möchten, sollten Sie verwenden stringByTrimmingCharactersInSet

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

Wenn Sie Leerzeichen an einer beliebigen Stelle in der Zeichenfolge entfernen möchten, sollten Sie sich stringByReplacing ...


Wie entferne ich auch den mittleren Raum?
Nikhil Gupta

@NikhilGupta Nein, nur führende und nachfolgende (das Beispiel " First Word "Ausgänge "First Word").
fpg1503

6

Swift 4, 4.2 und 5

Entfernen Sie nur Platz von vorne und von Ende

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

Entfernen Sie Leerzeichen an jeder Stelle in der Zeichenfolge

let stringWithSpaces = " The Akbar khan code "
let stringWithoutSpaces = stringWithSpaces.replacingOccurrences(of: " ", with: "")

3

Sie können dies auch versuchen

   let updatedString = searchedText?.stringByReplacingOccurrencesOfString(" ", withString: "-")

Funktioniert nur für "" (berücksichtigt keine anderen Arten von Whitesapce)
fpg1503

3

Versuchen Sie eine funktionale Programmierung, um Leerzeichen zu entfernen:

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

Wenn jemand zusätzlichen Platz aus der Zeichenfolge entfernt, z. B. = "This is the demo text remove extra space between the words."

Sie können diese Funktion in Swift 4 verwenden.

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
}

und Ergebnis wird sein

"This is the demo text remove extra space between the words."

3

Hallo, das könnte spät sein, aber einen Versuch wert. Dies ist aus einer Spielplatzdatei. Sie können es zu einer String-Erweiterung machen.

Dies ist in Swift 5.3 geschrieben

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

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

Dies ist für Swift 5.x
Kyle Emmanuel

Das ist toll! Danke
RJ Uy

2

Swift 3 Version

  //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

Leerzeichen in Swift 4 kürzen

let strFirstName = txtFirstName.text?.trimmingCharacters(in: 
 CharacterSet.whitespaces)

2

Noch eine Antwort: Manchmal kann die Eingabezeichenfolge mehr als ein Leerzeichen zwischen Wörtern enthalten. Wenn Sie standardisieren müssen, um nur 1 Leerzeichen zwischen den Wörtern zu haben, versuchen Sie dies (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

In der folgenden Zeile wurde für mich Leerzeichen entfernt.

let result = String(yourString.filter {![" ", "\t", "\n"].contains($0)})


-1

Swift 3-Version der Antwort von 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: "")
    }
}

Funktioniert nur für "" (berücksichtigt keine anderen Arten von Whitesapce)
fpg1503

Weil deine Antwort falsch ist. Die Antwort, für die Sie ein Update bereitgestellt haben, ist ebenfalls falsch. Es gibt verschiedene Arten von Leerzeichen, weshalb die Verwendung whitespaceCharacterSeteine bewährte Methode ist.
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

So entfernen Sie alle Leerzeichen aus der Zeichenfolge:

let space_removed_string = (yourstring?.components(separatedBy: " ").joined(separator: ""))!
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.