我需要解析一些未知数据,其中应该只包含数字值,但可能包含空格或其他非字母数字字符。
在Swift中有没有新的方法来做这件事?我在网上找到的所有内容似乎都是用旧的C方式完成的。
我正在查看 stringByTrimmingCharactersInSet
- 因为我确信我的输入字符串只会在开头或结尾包含空格/特殊字符。是否有任何内置的字符集可供使用?还是我需要创建自己的?
我希望有像stringFromCharactersInSet()
这样的东西,它允许我指定要保留的有效字符。
我需要解析一些未知数据,其中应该只包含数字值,但可能包含空格或其他非字母数字字符。
在Swift中有没有新的方法来做这件事?我在网上找到的所有内容似乎都是用旧的C方式完成的。
我正在查看 stringByTrimmingCharactersInSet
- 因为我确信我的输入字符串只会在开头或结尾包含空格/特殊字符。是否有任何内置的字符集可供使用?还是我需要创建自己的?
我希望有像stringFromCharactersInSet()
这样的东西,它允许我指定要保留的有效字符。
let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
let result = string.filter("0123456789.".contains)
CharacterSet
中的字符,请使用:let result = String(string.unicodeScalars.filter(CharacterSet.whitespaces.inverted.contains))
####.##
),你可以使用正则表达式。例如,使用较新的正则表达式字面量(如WWDC 2022的视频了解 Swift 正则表达式和Swift 正则表达式:超越基础知识中讨论的),将正则表达式用/
字符括起来:if let range = string.firstRange(of: /\d+(\.\d*)?/) {
let result = string[range] // or `String(string[range])` if you need `String`
}
range(of:options:)
和.regularExpression
选项:if let range = string.range(of: #"\d+(\.\d*)?"#, options: .regularExpression) {
let result = string[range] // or `String(string[range])` if you need `String`
}
let result = string.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
Swift 3
let result = string.replacingOccurrences( of:"[^0-9]", with: "", options: .regularExpression)
你可以给这个答案投赞成票。
我更喜欢这个解决方案,因为我喜欢扩展,并且对我来说看起来更加简洁。这里重现了解决方案:
extension String {
var digits: String {
return components(separatedBy: CharacterSet.decimalDigits.inverted)
.joined()
}
}
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter(String.digits.contains))
}
}
"abc12345".digits // "12345"
编辑/更新:
Swift 4.2
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self {
return filter(("0"..."9").contains)
}
}
或作为一种可变方法
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !("0"..."9" ~= $0) }
}
}
Swift 5.2 • Xcode 11.4或更高版本
在Swift5中,我们可以使用一个名为isWholeNumber
的新字符属性:
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self { filter(\.isWholeNumber) }
}
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !$0.isWholeNumber }
}
}
为了允许使用句号,我们可以扩展字符并创建一个计算属性:
extension Character {
var isDecimalOrPeriod: Bool { "0"..."9" ~= self || self == "." }
}
extension RangeReplaceableCollection where Self: StringProtocol {
var digitsAndPeriods: Self { filter(\.isDecimalOrPeriod) }
}
游乐场测试:
"abc12345".digits // "12345"
var str = "123abc0"
str.removeAllNonNumeric()
print(str) //"1230"
"Testing0123456789.".digitsAndPeriods // "0123456789."
Swift 4
我找到了一个不错的方法来从字符串中获取仅包含字母数字字符集的内容。例如:
func getAlphaNumericValue() {
var yourString = "123456789!@#$%^&*()AnyThingYouWant"
let unsafeChars = CharacterSet.alphanumerics.inverted // Remove the .inverted to get the opposite result.
let cleanChars = yourString.components(separatedBy: unsafeChars).joined(separator: "")
print(cleanChars) // 123456789AnyThingYouWant
}
使用filter
函数和rangeOfCharacterFromSet
的解决方案
let string = "sld [f]34é7*˜µ"
let alphaNumericCharacterSet = NSCharacterSet.alphanumericCharacterSet()
let filteredCharacters = string.characters.filter {
return String($0).rangeOfCharacterFromSet(alphaNumericCharacterSet) != nil
}
let filteredString = String(filteredCharacters) // -> sldf34é7µ
要仅过滤数字字符,请使用
let string = "sld [f]34é7*˜µ"
let numericSet = "0123456789"
let filteredCharacters = string.characters.filter {
return numericSet.containsString(String($0))
}
let filteredString = String(filteredCharacters) // -> 347
或者let numericSet : [Character] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
let filteredCharacters = string.characters.filter {
return numericSet.contains($0)
}
let filteredString = String(filteredCharacters) // -> 347
Swift 4
但没有扩展或componentsSeparatedByCharactersInSet,这不太容易理解。
let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
let string = "+1*(234) fds567@-8/90-"
let onlyNumbers = string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
print(onlyNumbers) // "1234567890"
或者
extension String {
func removeNonNumeric() -> String {
return self.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
}
}
let onlyNumbers = "+1*(234) fds567@-8/90-".removeNonNumeric()
print(onlyNumbers)// "1234567890"
Swift 4.2
let numericString = string.filter { (char) -> Bool in
return char.isNumber
}
Swift 3,过滤除数字以外的所有内容
let myString = "dasdf3453453fsdf23455sf.2234"
let result = String(myString.characters.filter { String($0).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
print(result)
let result = String(string.characters.filter { "01234567890.".characters.contains($0) })
可以缩短为let result = string.filter("01234567890.".contains)
。 - Leo Dabus