Удалить все нечисловые символы из строки в Swift
Мне нужно проанализировать некоторые неизвестные данные, которые должны быть просто числовым значением, но могут содержать пробелы или другие не буквенно-цифровые символы.
есть ли новый способ сделать это в swift 2.0? Все, что я могу найти в интернете, кажется, старый способ делать вещи.
Я смотрю на stringByTrimmingCharactersInSet-поскольку я уверен, что мои входные данные будут иметь только пробелы/специальные символы в начале или конце строки. Есть ли встроенные наборы символов I можно использовать для этого? Или мне нужно создать свой собственный?
Я надеялся, что будет что-то вроде stringFromCharactersInSet (), которое позволит мне указать только допустимые символы для сохранения
15 ответов
Я надеялся, что будет что-то вроде stringFromCharactersInSet (), которое позволит мне указать только допустимые символы для сохранения.
можно использовать trimmingCharacters
С inverted
набор символов для удаления символов из начала или конца строки. В Swift 3:
let result = string.trimmingCharacters(in: CharacterSet(charactersIn: "01234567890.").inverted)
или, в Swift 2:
let result = string.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "0123456789.").invertedSet)
или, если вы хотите удалить нечисловые символы в строке (а не только начало или конец), вы может filter
на characters
:
let result = String(string.characters.filter { "01234567890.".characters.contains() })
или, если вы хотите соответствовать только допустимым строкам определенного формата (например,####.## ), вы можете использовать регулярное выражение. Например, в Swift 3:
if let range = string.range(of: "\d+(\.\d*)?", options: .regularExpression) {
let result = string.substring(with: range)
}
или в Swift 2:
if let range = string.rangeOfString("\d+(\.\d*)?", options: .RegularExpressionSearch) {
let result = string.substringWithRange(range)
}
поведение этих разных подходов немного отличается, поэтому оно просто зависит от того, что вы пытаетесь сделать. Включите или исключите десятичную точку, если вы хотите десятичные числа или просто целые числа. Есть много способов добиться этого.
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()
}
}
решение с помощью и rangeOfCharacterFromSet
let string = "sld [f]34é7*˜µ"
let alphaNumericCharacterSet = NSCharacterSet.alphanumericCharacterSet()
let filteredCharacters = string.characters.filter {
return String().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())
}
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()
}
let filteredString = String(filteredCharacters) // -> 347
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 3, фильтрует все, кроме чисел
let myString = "dasdf3453453fsdf23455sf.2234"
let result = String(myString.characters.filter { String().rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
print(result)
вы можете сделать что-то подобное...
let string = "[,myString1. \"" // string : [,myString1. "
let characterSet = NSCharacterSet(charactersInString: "[,. \"")
let finalString = (string.componentsSeparatedByCharactersInSet(characterSet) as NSArray).componentsJoinedByString("")
print(finalString)
//finalString will be "myString1"
проблема с первым решением Роба является stringByTrimmingCharactersInSet
фильтрует только концы строки, а не все, как указано в документации Apple:
возвращает новую строку, созданную путем удаления с обоих концов символов приемника, содержащихся в заданном наборе символов.
вместо того, чтобы использовать componentsSeparatedByCharactersInSet
сначала изолировать все не-вхождения набора символов в массивы и затем объединить их с пустой строкой разделитель:
"$34%^56()78*9££".componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "0123456789").invertedSet)).joinWithSeparator("")
возвращает 123456789
Swift 3
extension String {
var keepNumericsOnly: String {
return self.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined(separator: "")
}
}
вы можете отфильтровать UnicodeScalarView строки с помощью оператора сопоставления шаблонов для диапазонов, передать UnicodeScalar ClosedRange от 0 до 9 и инициализировать новую строку с результирующим UnicodeScalarView:
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter{ String.digits ~= })
}
}
"abc12345".digits // "12345"
изменить/обновить:
Swift 4.2
extension StringProtocol {
var digits: String {
return String(filter(("0"..."9").contains))
}
}
или как мутирующий метод
extension StringProtocol where Self: RangeReplaceableCollection {
mutating func removeAllNonNumeric() {
removeAll { !("0"..."9" ~= ) }
}
}
Swift 4.0 Версия
extension String {
var numbers: String {
return String(describing: filter { String().rangeOfCharacter(from: CharacterSet(charactersIn: "0123456789")) != nil })
}
}
Swift 4
строку.Свифт!--6-->
import Foundation
extension String {
func removeCharacters(from forbiddenChars: CharacterSet) -> String {
let passed = self.unicodeScalars.filter { !forbiddenChars.contains() }
return String(String.UnicodeScalarView(passed))
}
func removeCharacters(from: String) -> String {
return removeCharacters(from: CharacterSet(charactersIn: from))
}
}
ViewController.Свифт!--6-->
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
Swift 4
но без расширений или componentsSeparatedByCharactersInset, который также не читается.
let allowedCharSet = NSCharacterSet.letters.union(.whitespaces)
let filteredText = String(sourceText.unicodeScalars.filter(allowedCharSet.contains))
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
}
}
Swift 4.2
let digitChars = yourString.components(separatedBy:
CharacterSet.decimalDigits.inverted).joined(separator: "")