从swift中删除字符串中的所有非数字字符

Dan*_*Dan 68 nscharacterset swift

我需要解析一些未知数据,这些数据应该只是一个数值,但可能包含空格或其他非字母数字字符.

在Swift中有这种新方法吗?我在网上找到的所有东西似乎都是旧C的做事方式.

我正在看stringByTrimmingCharactersInSet- 因为我确信我的输入在字符串的开头或结尾只有空格/特殊字符.我可以使用任何内置字符集吗?或者我需要创建自己的?

我希望会有类似的东西stringFromCharactersInSet()允许我只指定有效字符

Rob*_*Rob 134

我希望有像stringFromCharactersInSet()这样的东西,这将允许我只指定要保留的有效字符.

您可以使用trimmingCharactersinverted字符集从开始或字符串的结尾删除字符.在Swift 3及更高版本中:

let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
Run Code Online (Sandbox Code Playgroud)

或者,如果你想删除字符串中任何地方的非数字字符(不仅仅是开头或结尾),你可以filtercharacters例如Swift 4.2.1中删除:

let result = string.filter("0123456789.".contains)
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想匹配某种格式的有效字符串(例如####.##),则可以使用正则表达式.例如:

let result = String(string.unicodeScalars.filter(CharacterSet.whitespaces.inverted.contains))
Run Code Online (Sandbox Code Playgroud)

这些不同方法的行为略有不同,因此它只取决于您正在尝试做什么.如果需要十进制数或仅整数,请包含或排除小数点.有很多方法可以实现这一目标.


对于较旧的Swift 2语法,请参阅此答案的上一版本.

  • @AndyIbanez就像说,如果"ABC"是我想保留的角色,那么修剪一切不是"ABC"的东西. (4认同)
  • 在 Swift 4.2.1 中 `let result = String(string.characters.filter { "01234567890.".characters.contains($0) })` 可以缩写为 `let result = string.filter("01234567890.".contains) ` (4认同)

Tom*_*ard 36

let result = string.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

let result = string.replacingOccurrences( of:"[^0-9]", with: "", options: .regularExpression)
Run Code Online (Sandbox Code Playgroud)

你可以推荐这个答案.

  • 谢谢!在获得所有Swift3更改之后,我留下了这个:myStr.replacingOccurrences(of:"[^ 0-9]",with:"",options:.regularExpression) (3认同)

Jak*_*nin 23

我更喜欢这个解决方案,因为我喜欢扩展,对我来说似乎更清洁.解决方案转载于此

extension String {
    var digits: String {
        return components(separatedBy: CharacterSet.decimalDigits.inverted)
            .joined()
    }
}
Run Code Online (Sandbox Code Playgroud)


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

}
Run Code Online (Sandbox Code Playgroud)


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µ
Run Code Online (Sandbox Code Playgroud)

要仅过滤数字字符,请使用

let string = "sld [f]34é7*˜µ"

let numericSet = "0123456789"
let filteredCharacters = string.characters.filter {
  return numericSet.containsString(String($0))
}
let filteredString = String(filteredCharacters) // -> 347
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)


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"
Run Code Online (Sandbox Code Playgroud)

编辑/更新:

Swift 4.2

extension RangeReplaceableCollection where Self: StringProtocol {
    var digits: Self {
        return filter(("0"..."9").contains)
    }
}
Run Code Online (Sandbox Code Playgroud)

或作为一种变异方法

extension RangeReplaceableCollection where Self: StringProtocol {
    mutating func removeAllNonNumeric() {
        removeAll { !("0"..."9" ~= $0) }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ser 5

斯威夫特4

但是没有扩展或componentSeparatedByCharactersInSet,它也不是很好读。

let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
Run Code Online (Sandbox Code Playgroud)


Vla*_*kov 5

let string = "+1*(234) fds567@-8/90-"
let onlyNumbers = string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()

print(onlyNumbers) // "1234567890"
Run Code Online (Sandbox Code Playgroud)

或者

extension String {

  func removeNonNumeric() -> String {
    return self.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
  }
}

let onlyNumbers = "+1*(234) fds567@-8/90-".removeNonNumeric() 
print(onlyNumbers)// "1234567890"
Run Code Online (Sandbox Code Playgroud)