2016-04-01 2 views

Antwort

5

Alternative ohne reguläre Ausdrücke Lösung:

let foo = "This  is  a string with a lot of spaces!" 
let bar = foo 
    .componentsSeparatedByString(" ") 
    .filter { !$0.isEmpty } 
    .joinWithSeparator("_") 

print(bar) /* This_is_a_string_with_a_lot_of_spaces! */ 

Arbeiten auch für Unicode-Zeichen (dank @MartinR für dieses schöne Beispiel)

let foo = "  " 

// ... 

/* _____ */ 
+1

Das ist eine ziemlich glatte Verwendung von Filter. –

+1

@NateBirkholz Ich möchte jedoch darauf hinweisen, dass diese Methode keine Gruppen von Leerzeichen vor und nach dem ersten bzw. letzten Wort ersetzt; Diese Leerzeichen werden einfach entfernt (z. B. "Dies ist eine Zeichenfolge mit vielen Leerzeichen!") "wird das gleiche Ergebnis wie für" "Dies ist eine Zeichenfolge mit vielen Leerzeichen!"). – dfri

+0

Das ist genau das, was ich brauche, so dass das kein Problem sein wird – sloeberGJ

3

Sie können einen einfachen regulären Ausdruck Ersatz verwenden, um dies zu tun:

let myString = "  " 
if let regex = try? NSRegularExpression(pattern: "\\s+", options: []) { 
    let replacement = regex.stringByReplacingMatchesInString(myString, options: .WithTransparentBounds, range: NSMakeRange(0, (myString as NSString).length), withTemplate: "_") 
    print(replacement) 
    // "_____" 
} 
+1

Testen Sie Ihren Code mit dem 'let myString =" "' ... :) –

+3

WHHHYYYYY UNICODE WHYYYY – brandonscript

4

@remus Vorschlag kann vereinfacht werden (und machte Unicode/Emoji/Fla g-safe) als

let myString = " This  is  a string with a lot of spaces!   " 
let replacement = myString.stringByReplacingOccurrencesOfString("\\s+", withString: "_", options: .RegularExpressionSearch) 
print(replacement) 
// _This_is_a_string_with_a_lot_of_spaces!____ 
1

Alternative ohne reguläre Ausdrücke, reine Swift (kein Überbrückungs zu NSString) Lösung:

let spaced = "This  is  a string with a lot of spaces!" 

let under = spaced.characters.split(" ", allowEmptySlices: false).map(String.init).joinWithSeparator("_") 

Alternate, alternative Version, die keine führende und nachfolgende Leerzeichen entfernen, wenn sich die Umwandlung. Leicht Kürze wegen verschleiert ... ;-)

let reduced = String(spaced.characters.reduce([Character]()) { let n = $1 == " " ? "_" : $1; var o = $0; o.append(n); guard let e = $0.last else { return o }; return e == "_" && n == "_" ? $0 : o }) 

Es gibt wahrscheinlich eine clevere Lösung flatMap() beteiligt, aber ich werde es jemand klüger als ich verlassen!

+0

Beachten Sie, dass wie in @dfris 'Lösung entfernt und ersetzt nicht die ersten und nachfolgenden Leerzeichen. –

+0

@MartinR Bekannt und aktualisiert! – ColGraff