Swift中修剪字符串的每个示例都会删除前导和尾随空格,但是如何只删除尾随空格?
例如,如果我有一个字符串:
" example "
我怎么能最终得到:
" example"
我发现的每个解决方案都显示trimmingCharacters(in: CharacterSet.whitespaces)
,但我想保留领先的空白.
RegEx是一种可能性,或者可以导出一个范围来确定要删除的字符索引,但我似乎无法为此找到一个优雅的解决方案.
使用正则表达式:
let string = " example " let trimmed = string.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression) print(">" + trimmed + "<") // > example<
\s+
匹配一个或多个空白字符,并$
匹配字符串的结尾.
在Swift 4中
var trailingSpacesTrimmed: String { var newString = self while newString.last?.isWhitespace == true { newString = String(newString.dropLast()) } return newString }
这个简短的Swift 3字符串扩展使用rangeOfCharacter的.anchored和.backwards选项,然后在需要循环时递归调用自身.因为编译器期望将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 } }
在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*
(正如Martin R.先做的那样),我们可以跳过if let
防守并强制解开可选项,因为总会有匹配.我认为这更好,因为它显然是安全的,并且如果你改变正则表达式仍然是安全的.我没有考虑性能.
Handy String扩展在Swift 4中
extension String { func trimmingTrailingSpaces() -> String { var t = self while t.hasSuffix(" ") { t = "" + t.dropLast() } return t } mutating func trimmedTrailingSpaces() { self = self.trimmingTrailingSpaces() } }