Обрезать только завершающий пробел с конца строки в Swift 3
Каждый пример обрезки строк в Swift удаляет как верхние, так и конечные пробелы, но как удалить только пробелы в пробел?
Например, если у меня есть строка:
" example "
Как я могу закончить:
" example"
Каждое найденное решение показывает trimmingCharacters(in: CharacterSet.whitespaces)
, но я хочу сохранить ведущие пробелы.
RegEx - это возможность, или диапазон может быть выведен для определения индекса символов для удаления, но я не могу найти элегантное решение для этого.
Ответы
Ответ 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
}
}