Подтвердить что ты не робот

Обрезать только завершающий пробел с конца строки в Swift 3

Каждый пример обрезки строк в Swift удаляет как верхние, так и конечные пробелы, но как удалить только пробелы в пробел?

Например, если у меня есть строка:

"    example  "

Как я могу закончить:

"    example"

Каждое найденное решение показывает trimmingCharacters(in: CharacterSet.whitespaces), но я хочу сохранить ведущие пробелы.

RegEx - это возможность, или диапазон может быть выведен для определения индекса символов для удаления, но я не могу найти элегантное решение для этого.

4b9b3361

Ответ 1

С регулярными выражениями:

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

\s+ соответствует одному или нескольким символам пробела, а $ соответствует конец строки.

Ответ 2

В Swift 4 и Swift 5

Этот код также удалит завершающие новые строки.

var trailingSpacesTrimmed: String {
    var newString = self

    while newString.last?.isWhitespace == true {
        newString = String(newString.dropLast())
    }

    return newString
}

Ответ 3

В этом коротком расширении строки Swift 3 используется опция .anchored и .backwards rangeOfCharacter, а затем вызывается сама рекурсивно, если требуется цикл. Поскольку компилятор ожидает в качестве параметра CharacterSet, вы можете просто поставить статическую информацию при вызове, например. "1234 ".trailing(.whitespaces) вернет "1234". (Я не делал таймингов, но ожидал бы быстрее, чем регулярное выражение.)

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

Ответ 4

В Foundation вы можете получить диапазоны индексов, соответствующих регулярному выражению. Вы также можете заменить поддиапазоны. Объединив это, получим:

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

Вы также можете иметь мутирующую версию этого:

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

Если мы сопоставим с \s* (как это делал ранее Мартин Р.), мы можем пропустить if let guard и force-unwrap опцию, так как всегда будет совпадение. Я думаю, что это лучше, поскольку он явно безопасен и остается в безопасности, если вы измените регулярное выражение. Я не думал о производительности.

Ответ 5

Удлинитель Handy String 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()
    }

}

Ответ 6

Немного взломанный: D

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

Ответ 7

Без регулярного выражения нет прямого способа добиться этого. Альтернативно вы можете использовать следующую функцию для достижения требуемого результата:

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)


    }

Вы можете использовать эту функцию следующим образом: -

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

Ответ 8

Swift 4

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