从 swift 中的字符串中删除所有非数字字符
Remove all non-numeric characters from a string in swift
我需要解析一些未知数据,这些数据应该只是一个数值,但可能包含空格或其他非字母数字字符。
在 Swift 中有新的方法吗?我在网上所能找到的似乎都是旧的 C 做事方式。
我正在查看 stringByTrimmingCharactersInSet
- 因为我确定我的输入在字符串的开头或结尾只有 whitespace/special 个字符。有没有我可以使用的内置字符集?还是我需要自己创建?
我希望有类似 stringFromCharactersInSet()
的东西,它允许我只指定要保留的有效字符
你可以这样做...
let string = "[,myString1. \"" // string : [,myString1. "
let characterSet = NSCharacterSet(charactersInString: "[,. \"")
let finalString = (string.componentsSeparatedByCharactersInSet(characterSet) as NSArray).componentsJoinedByString("")
print(finalString)
//finalString will be "myString1"
使用filter
函数和rangeOfCharacterFromSet
的解决方案
let string = "sld [f]34é7*˜µ"
let alphaNumericCharacterSet = NSCharacterSet.alphanumericCharacterSet()
let filteredCharacters = string.characters.filter {
return String([=10=]).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([=11=]))
}
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([=12=])
}
let filteredString = String(filteredCharacters) // -> 347
I was hoping there would be something like stringFromCharactersInSet() which would allow me to specify only valid characters to keep.
您可以使用 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)
或者,如果您想从字符串中的任意位置删除 CharacterSet 中的字符,请使用:
let result = String(string.unicodeScalars.filter(CharacterSet.whitespaces.inverted.contains))
或者,如果您只想匹配特定格式的有效字符串(例如 ####.##
),您可以使用正则表达式。例如:
if let range = string.range(of: #"\d+(\.\d*)?"#, options: .regularExpression) {
let result = string[range] // or `String(string[range])` if you need `String`
}
这些不同方法的行为略有不同,因此它完全取决于您要执行的操作。如果您想要小数或仅整数,请包括或排除小数点。有很多方法可以做到这一点。
对于较旧的 Swift 2 语法,请参阅 previous revision of this answer。
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)
您可以投票 this answer。
Rob 的第一个解决方案的问题是 stringByTrimmingCharactersInSet
仅过滤字符串的结尾而不是整个字符串,如 Apple 文档中所述:
Returns a new string made by removing from both ends of the receiver characters contained in a given character set.
而是使用 componentsSeparatedByCharactersInSet
首先将所有未出现的字符集隔离到数组中,然后使用空字符串分隔符将它们连接起来:
"$34%^56()78*9££".componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "0123456789").invertedSet)).joinWithSeparator("")
哪个returns123456789
Swift 3、过滤除数字以外的所有
let myString = "dasdf3453453fsdf23455sf.2234"
let result = String(myString.characters.filter { String([=10=]).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
print(result)
Swift 3 版本
extension String
{
func trimmingCharactersNot(in charSet: CharacterSet) -> String
{
var s:String = ""
for unicodeScalar in self.unicodeScalars
{
if charSet.contains(unicodeScalar)
{
s.append(String(unicodeScalar))
}
}
return s
}
}
我更喜欢 this solution,因为我喜欢扩展,而且对我来说它看起来更干净一些。解决方案转载于此:
extension String {
var digits: String {
return components(separatedBy: CharacterSet.decimalDigits.inverted)
.joined()
}
}
Swift 3
extension String {
var keepNumericsOnly: String {
return self.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined(separator: "")
}
}
Swift 4.0 版本
extension String {
var numbers: String {
return String(describing: filter { String([=10=]).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
}
}
Swift 4
String.swift
import Foundation
extension String {
func removeCharacters(from forbiddenChars: CharacterSet) -> String {
let passed = self.unicodeScalars.filter { !forbiddenChars.contains([=10=]) }
return String(String.UnicodeScalarView(passed))
}
func removeCharacters(from: String) -> String {
return removeCharacters(from: CharacterSet(charactersIn: from))
}
}
ViewController.swift
let character = "1Vi234s56a78l9"
let alphaNumericSet = character.removeCharacters(from: CharacterSet.decimalDigits.inverted)
print(alphaNumericSet) // will print: 123456789
let alphaNumericCharacterSet = character.removeCharacters(from: "0123456789")
print("no digits",alphaNumericCharacterSet) // will print: Vishal
您可以使用范围的模式匹配运算符过滤字符串的 UnicodeScalarView,传递从 0 到 9 的 UnicodeScalar ClosedRange,并使用生成的 UnicodeScalarView 初始化新字符串:
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter(String.digits.contains))
}
}
"abc12345".digits // "12345"
edit/update:
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" ~= [=12=]) }
}
}
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 { ![=14=].isWholeNumber }
}
}
为了也允许句点,我们可以扩展 Character 并创建一个计算 属性:
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
}
Swift 4
但没有扩展或 componentsSeparatedByCharactersInSet 也不能读取。
let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
Swift 4.2
let digitChars = yourString.components(separatedBy:
CharacterSet.decimalDigits.inverted).joined(separator: "")
Swift 4.2
let numericString = string.filter { (char) -> Bool in
return char.isNumber
}
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 中有新的方法吗?我在网上所能找到的似乎都是旧的 C 做事方式。
我正在查看 stringByTrimmingCharactersInSet
- 因为我确定我的输入在字符串的开头或结尾只有 whitespace/special 个字符。有没有我可以使用的内置字符集?还是我需要自己创建?
我希望有类似 stringFromCharactersInSet()
的东西,它允许我只指定要保留的有效字符
你可以这样做...
let string = "[,myString1. \"" // string : [,myString1. "
let characterSet = NSCharacterSet(charactersInString: "[,. \"")
let finalString = (string.componentsSeparatedByCharactersInSet(characterSet) as NSArray).componentsJoinedByString("")
print(finalString)
//finalString will be "myString1"
使用filter
函数和rangeOfCharacterFromSet
let string = "sld [f]34é7*˜µ"
let alphaNumericCharacterSet = NSCharacterSet.alphanumericCharacterSet()
let filteredCharacters = string.characters.filter {
return String([=10=]).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([=11=]))
}
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([=12=])
}
let filteredString = String(filteredCharacters) // -> 347
I was hoping there would be something like stringFromCharactersInSet() which would allow me to specify only valid characters to keep.
您可以使用 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)
或者,如果您想从字符串中的任意位置删除 CharacterSet 中的字符,请使用:
let result = String(string.unicodeScalars.filter(CharacterSet.whitespaces.inverted.contains))
或者,如果您只想匹配特定格式的有效字符串(例如 ####.##
),您可以使用正则表达式。例如:
if let range = string.range(of: #"\d+(\.\d*)?"#, options: .regularExpression) {
let result = string[range] // or `String(string[range])` if you need `String`
}
这些不同方法的行为略有不同,因此它完全取决于您要执行的操作。如果您想要小数或仅整数,请包括或排除小数点。有很多方法可以做到这一点。
对于较旧的 Swift 2 语法,请参阅 previous revision of this answer。
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)
您可以投票 this answer。
Rob 的第一个解决方案的问题是 stringByTrimmingCharactersInSet
仅过滤字符串的结尾而不是整个字符串,如 Apple 文档中所述:
Returns a new string made by removing from both ends of the receiver characters contained in a given character set.
而是使用 componentsSeparatedByCharactersInSet
首先将所有未出现的字符集隔离到数组中,然后使用空字符串分隔符将它们连接起来:
"$34%^56()78*9££".componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "0123456789").invertedSet)).joinWithSeparator("")
哪个returns123456789
Swift 3、过滤除数字以外的所有
let myString = "dasdf3453453fsdf23455sf.2234"
let result = String(myString.characters.filter { String([=10=]).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
print(result)
Swift 3 版本
extension String
{
func trimmingCharactersNot(in charSet: CharacterSet) -> String
{
var s:String = ""
for unicodeScalar in self.unicodeScalars
{
if charSet.contains(unicodeScalar)
{
s.append(String(unicodeScalar))
}
}
return s
}
}
我更喜欢 this solution,因为我喜欢扩展,而且对我来说它看起来更干净一些。解决方案转载于此:
extension String {
var digits: String {
return components(separatedBy: CharacterSet.decimalDigits.inverted)
.joined()
}
}
Swift 3
extension String {
var keepNumericsOnly: String {
return self.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined(separator: "")
}
}
Swift 4.0 版本
extension String {
var numbers: String {
return String(describing: filter { String([=10=]).rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
}
}
Swift 4
String.swift
import Foundation
extension String {
func removeCharacters(from forbiddenChars: CharacterSet) -> String {
let passed = self.unicodeScalars.filter { !forbiddenChars.contains([=10=]) }
return String(String.UnicodeScalarView(passed))
}
func removeCharacters(from: String) -> String {
return removeCharacters(from: CharacterSet(charactersIn: from))
}
}
ViewController.swift
let character = "1Vi234s56a78l9"
let alphaNumericSet = character.removeCharacters(from: CharacterSet.decimalDigits.inverted)
print(alphaNumericSet) // will print: 123456789
let alphaNumericCharacterSet = character.removeCharacters(from: "0123456789")
print("no digits",alphaNumericCharacterSet) // will print: Vishal
您可以使用范围的模式匹配运算符过滤字符串的 UnicodeScalarView,传递从 0 到 9 的 UnicodeScalar ClosedRange,并使用生成的 UnicodeScalarView 初始化新字符串:
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter(String.digits.contains))
}
}
"abc12345".digits // "12345"
edit/update:
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" ~= [=12=]) }
}
}
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 { ![=14=].isWholeNumber }
}
}
为了也允许句点,我们可以扩展 Character 并创建一个计算 属性:
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
}
Swift 4
但没有扩展或 componentsSeparatedByCharactersInSet 也不能读取。
let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
Swift 4.2
let digitChars = yourString.components(separatedBy:
CharacterSet.decimalDigits.inverted).joined(separator: "")
Swift 4.2
let numericString = string.filter { (char) -> Bool in
return char.isNumber
}
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"