Swift удаляет только конечные пробелы из строки

многие примеры в SO фиксируют обе стороны, ведущую и конечную. Моя просьба касается только трейлинга. Мой входной текст: "держите мою левую сторону " Желаемый результат: "держите мою левую сторону"

конечно, эта команда удалит оба конца:

let cleansed = messageText.trimmingCharacters(in: .whitespacesAndNewlines)

который не будет работать для меня.

Как я могу это сделать?

3 ответов


довольно простым решением является регулярное выражение, шаблон один или более(+) пробельные символы(\s) в конце строки($)

let string = " keep my left side "
let cleansed = string.replacingOccurrences(of: "\s+$", 
                                         with: "", 
                                      options: .regularExpression)

вы можете использовать функцию rangeOfCharacter для строки с набором символов. Это расширение затем использует рекурсию есть несколько пробелов для обрезки. Это будет эффективно, если у вас обычно есть только небольшое количество пробелов.

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

"1234 ".trailingTrim(.whitespaces)

возвращает

"1234"


основываясь на ответе вадиана, я нашел для Swift 3 во время написания, что я должен был включить параметр диапазона. Итак:

func trailingTrim(with string : String) -> String {

    let start = string.startIndex
    let end = string.endIndex
    let range: Range<String.Index> = Range<String.Index>(start: start, end: end)


    let cleansed:String = string.stringByReplacingOccurrencesOfString("\s+$",
                                                                      withString: "",
                                                                      options: .RegularExpressionSearch,
                                                                      range: range)

    return cleansed
}