Dan*_*Dan 68 nscharacterset swift
我需要解析一些未知数据,这些数据应该只是一个数值,但可能包含空格或其他非字母数字字符.
在Swift中有这种新方法吗?我在网上找到的所有东西似乎都是旧C的做事方式.
我正在看stringByTrimmingCharactersInSet- 因为我确信我的输入在字符串的开头或结尾只有空格/特殊字符.我可以使用任何内置字符集吗?或者我需要创建自己的?
我希望会有类似的东西stringFromCharactersInSet()允许我只指定有效字符
Rob*_*Rob 134
我希望有像stringFromCharactersInSet()这样的东西,这将允许我只指定要保留的有效字符.
您可以使用trimmingCharacters与inverted字符集从开始或字符串的结尾删除字符.在Swift 3及更高版本中:
let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
或者,如果你想删除字符串中任何地方的非数字字符(不仅仅是开头或结尾),你可以filter在characters例如Swift 4.2.1中删除:
let result = string.filter("0123456789.".contains)
或者,如果您只想匹配某种格式的有效字符串(例如####.##),则可以使用正则表达式.例如:
let result = String(string.unicodeScalars.filter(CharacterSet.whitespaces.inverted.contains))
这些不同方法的行为略有不同,因此它只取决于您正在尝试做什么.如果需要十进制数或仅整数,请包含或排除小数点.有很多方法可以实现这一目标.
对于较旧的Swift 2语法,请参阅此答案的上一版本.
Tom*_*ard 36
let result = string.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
斯威夫特3
let result = string.replacingOccurrences( of:"[^0-9]", with: "", options: .regularExpression)
你可以推荐这个答案.
Jak*_*nin 23
我更喜欢这个解决方案,因为我喜欢扩展,对我来说似乎更清洁.解决方案转载于此
extension String {
    var digits: String {
        return components(separatedBy: CharacterSet.decimalDigits.inverted)
            .joined()
    }
}
Aas*_*ish 14
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
}
vad*_*ian 11
使用该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
Leo*_*bus 10
您可以使用模式匹配运算符过滤字符串的UnicodeScalarView,将UnicodeScalar ClosedRange从0传递到9,并使用生成的UnicodeScalarView初始化新的String:
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) }
    }
}
斯威夫特4
但是没有扩展或componentSeparatedByCharactersInSet,它也不是很好读。
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"
| 归档时间: | 
 | 
| 查看次数: | 37267 次 | 
| 最近记录: |