web-dev-qa-db-de.com

Schneiden Sie in Swift 3 nur nachlaufende Leerzeichen vom Ende der Zeichenfolge ab

Jedes Beispiel für das Beschneiden von Strings in Swift entfernt sowohl den führenden als auch den nachlaufenden Leerraum, aber wie kann nur nachlaufender Whitespace entfernt werden?

Wenn ich zum Beispiel einen String habe:

"    example  "

Wie kann ich enden mit:

"    example"

Jede Lösung, die ich gefunden habe, zeigt trimmingCharacters(in: CharacterSet.whitespaces), aber ich möchte den führenden Whitespace beibehalten. 

RegEx ist eine Möglichkeit, oder es kann ein Bereich abgeleitet werden, um den Index der zu entfernenden Zeichen zu bestimmen. Ich kann jedoch keine elegante Lösung dafür finden.

21
Jason Sturges

Mit regulären Ausdrücken:

let string = "    example  "
let trimmed = string.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression)
print(">" + trimmed + "<")
// >    example<

\s+ entspricht einem oder mehreren Leerzeichen, und $ entspricht dem Ende der Zeichenfolge.

31
Martin R

In Swift 4

var trailingSpacesTrimmed: String {
    var newString = self

    while newString.hasSuffix(" ") {
        newString = String(newString.dropLast())
    }

    return newString
}
8
Demosthese

Diese kurze Swift-3-Erweiterung von string verwendet die Option .anchored und .backwards von rangeOfCharacter und ruft sich selbst dann rekursiv auf, wenn eine Schleife erforderlich ist. Da der Compiler ein CharacterSet als Parameter erwartet, können Sie beim Aufruf einfach die Statik angeben, z. "1234 ".trailing(.whitespaces) gibt "1234" zurück. (Ich habe keine Timings gemacht, würde aber schneller als Regex erwarten.)

extension String {
    func trailingTrim(_ characterSet : CharacterSet) -> String {
        if let range = rangeOfCharacter(from: characterSet, options: [.anchored, .backwards]) {
            return self.substring(to: range.lowerBound).trailingTrim(characterSet)
        }
        return self
    }
}
7
Obliquely

In Foundation können Sie Indexbereiche abrufen, die einem regulären Ausdruck entsprechen. Sie können auch Unterbereiche ersetzen. Wenn wir dies kombinieren, erhalten wir:

import Foundation
extension String {
    func trimTrailingWhitespace() -> String {
        if let trailingWs = self.range(of: "\\s+$", options: .regularExpression) {
            return self.replacingCharacters(in: trailingWs, with: "")
        } else {
            return self
        }
    }
}

Sie können auch eine mutierende Version davon haben:

import Foundation
extension String {
    mutating func trimTrailingWhitespace() {
        if let trailingWs = self.range(of: "\\s+$", options: .regularExpression) {
            self.replaceSubrange(trailingWs, with: "")
        }
    }
}

Wenn wir mit \s* übereinstimmen (wie Martin R. es zuerst tat), können wir den if let-Guard überspringen und die Option mit Gewalt auspacken, da es immer eine Übereinstimmung geben wird. Ich denke, das ist schöner, da es offensichtlich sicher ist, und es bleibt sicher, wenn Sie den Regex ändern. Ich habe nicht an Leistung gedacht.

6
Raphael

Handy String Erweiterung In Swift 4

extension String {

    func trimmingTrailingSpaces() -> String {
        var t = self
        while t.hasSuffix(" ") {
          t = "" + t.dropLast()
        }
        return t
    }

    mutating func trimmedTrailingSpaces() {
        self = self.trimmingTrailingSpaces()
    }

}
5
TimBigDev

Es ist ein bisschen hackig: D

let message = "    example  "
var trimmed = ("s" + message).trimmingCharacters(in: .whitespacesAndNewlines)
trimmed = trimmed.substring(from: trimmed.index(after: trimmed.startIndex))
3
Duyen-Hoa

Ohne regulären Ausdruck gibt es keine direkte Möglichkeit, dies zu erreichen. Alternativ können Sie die unten stehende Funktion verwenden, um das gewünschte Ergebnis zu erzielen:

func removeTrailingSpaces(with spaces : String) -> String{

        var spaceCount = 0
        for characters in spaces.characters{
            if characters == " "{
                print("Space Encountered")
                spaceCount = spaceCount + 1
            }else{
                break;
            }
        }

        var finalString = ""
        let duplicateString = spaces.replacingOccurrences(of: " ", with: "")
        while spaceCount != 0 {
          finalString = finalString + " "
            spaceCount = spaceCount - 1
        }

        return (finalString + duplicateString)


    }

Sie können diese Funktion folgendermaßen verwenden: -

 let str = "   Himanshu  "
 print(removeTrailingSpaces(with : str))
2
Himanshu

Swift 4

extension String {
    var trimmingTrailingSpaces: String {
        if let range = rangeOfCharacter(from: .whitespacesAndNewlines, options: [.anchored, .backwards]) {
            return String(self[..<range.lowerBound]).trimmingTrailingSpaces
        }
        return self
    }
}
1
John Rogers