Подтвердить что ты не робот

Фильтрация цифр из строки

Используя только быстрый код, я не могу понять, как взять "(555) 555-5555" и вернуть только числовые значения и получить "5555555555". Мне нужно удалить все круглые скобки, пробелы и тире. Единственные примеры, которые я могу найти, находятся в objective-C, и они, похоже, все используют метод .trim(). Кажется, что у swift нет этого метода, но он имеет метод .stringByTrimmingCharacters, но только кажется, что он обрезает пробелы до и после данных.

4b9b3361

Ответ 1

Свифт 3 и 4:

extension String {
    var digits: String {
        return components(separatedBy: CharacterSet.decimalDigits.inverted)
            .joined()
    }
}

Ответ 2

Разбейте строку нецифровыми символами на массив цифр и соедините их обратно в строку:

Свифт 1:

let stringArray = origString.componentsSeparatedByCharactersInSet(
    NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let newString = NSArray(array: stringArray).componentsJoinedByString("")

Свифт 2:

let stringArray = origString.componentsSeparatedByCharactersInSet(
    NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let newString = stringArray.joinWithSeparator("")

Свифт 3 и 4:

let newString = origString
    .components(separatedBy:CharacterSet.decimalDigits.inverted)
    .joined(separator: "")

Ответ 3

Мне нравятся регулярные выражения:

var s = "(555) 555-5555"
s = s.stringByReplacingOccurrencesOfString(
    "\\D", withString: "", options: .RegularExpressionSearch, 
    range: s.startIndex..<s.endIndex)

Ответ 4

Вот ответ @Tapani Swift 2.0 как удобное расширение строки, (свойство length не является частью решения, но я оставил его в примере, потому что он также удобен):

import Foundation

extension String {

    var length : Int {
        return self.characters.count
    }

    func digitsOnly() -> String{
        let stringArray = self.componentsSeparatedByCharactersInSet(
            NSCharacterSet.decimalDigitCharacterSet().invertedSet)
        let newString = stringArray.joinWithSeparator("")

        return newString
    }

}

Использование:

let phone = "(123)-123 - 1234"
print(phone.digitsOnly())

Ответ 5

В Swift 4 решение более приятное:

import Foundation

let sourceText = "+5 (555) 555-5555"

let allowedCharset = CharacterSet
    .decimalDigits
    .union(CharacterSet(charactersIn: "+"))

let filteredText = String(sourceText.unicodeScalars.filter(allowedCharset.contains))

print(filteredText) // +55555555555

Ответ 6

подробности

  • Версия Xcode 10.2.1 (10E1001), Swift 5

Решение

import Foundation

extension String {

    private func removeCharacters(unicodeScalarsFilter: (UnicodeScalar) -> Bool) -> String {
        let filtredUnicodeScalars = unicodeScalars.filter { unicodeScalarsFilter($0) }
        return String(String.UnicodeScalarView(filtredUnicodeScalars))
    }

    private func filterCharacters(definedIn charSets: [CharacterSet], unicodeScalarsFilter: (CharacterSet, UnicodeScalar) -> Bool) -> String {
        if charSets.isEmpty { return self }
        let charSet = charSets.reduce(CharacterSet()) { return $0.union($1) }
        return removeCharacters { unicodeScalarsFilter(charSet, $0) }
    }

    func removeCharacters(charSets: [CharacterSet]) -> String { return filterCharacters(definedIn: charSets) { !$0.contains($1) } }
    func removeCharacters(charSet: CharacterSet) -> String { return removeCharacters(charSets: [charSet]) }

    func onlyCharacters(charSets: [CharacterSet]) -> String { return filterCharacters(definedIn: charSets) { $0.contains($1) } }
    func onlyCharacters(charSet: CharacterSet) -> String { return onlyCharacters(charSets: [charSet]) }
}

использование

let string = "23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b'kefl;nwdl qsa'WKFSA,.E"
print("original string:                                 \(string)")
print("only .decimalDigits:                             \(string.onlyCharacters(charSet: .decimalDigits))")
print("only [.lowercaseLetters, .symbols]:              \(string.onlyCharacters(charSets: [.lowercaseLetters, .symbols]))")
print("remove .letters:                                 \(string.removeCharacters(charSet: .letters))")
print("remove [.decimalDigits, .lowercaseLetters]:      \(string.removeCharacters(charSets: [.decimalDigits, .lowercaseLetters]))")

Результат

original string:                                 23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b'kefl;nwdl qsa'WKFSA,.E
only .decimalDigits:                             2345425241309499238304
only [.lowercaseLetters, .symbols]:              fgdorivwer+wiuruwu$q+dgnkvljb'keflnwdlqsa'
remove .letters:                                 2345#@%#425  24 1+ 30949*()92_)$#)_ 38304+{ '; ',.
remove [.decimalDigits, .lowercaseLetters]:      #@%#   +DWEJ *()ER_)$I#Q)_ U+RFJO{ '; 'WKFSA,.E

(Необязательно) Расширение строки

extension String {
    var onlyDigits: String { return onlyCharacters(charSets: [.decimalDigits]) }
    var onlyLetters: String { return onlyCharacters(charSets: [.letters]) }
}

(Необязательно) Использование расширения строки

let string = "23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b'kefl;nwdl qsa'WKFSA,.E"
print("original string:     \(string)")
print(".onlyDigits:         \(string.onlyDigits)")
print(".onlyLetters:        \(string.onlyLetters)")

(Необязательно) Результат расширения строки

original string:     23f45gdor#@%#i425v wer 24 1+DWEJwi 3u09ru49w*()9uE2R_)$I#Q)_ U383q04+RFJO{dgnkvlj b'kefl;nwdl qsa'WKFSA,.E
.onlyDigits:         2345425241309499238304
.onlyLetters:        fgdorivwerDWEJwiuruwuERIQUqRFJOdgnkvljbkeflnwdlqsaWKFSAE

Ответ 7

У меня была похожая проблема, но мне нужно было сохранить десятичные точки. Я подправил лучший ответ на это:

extension String {

    /// Returns a string with all non-numeric characters removed
    public var numericString: String {
        let characterSet = CharacterSet(charactersIn: "01234567890.").inverted
        return components(separatedBy: characterSet)
            .joined()
    }
}

Ответ 8

Вы хотите использовать NSCharacterSet:

Проверьте эту ссылку NSHipster для реализации Swift и Obj-C: http://nshipster.com/nscharacterset/

Аналогичный пример:

var string = "  Lorem    ipsum dolar   sit  amet. "

let components = string.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).filter({!isEmpty($0)})

string = join(" ", components)

Смотрите: punctuationCharacterSet

Описание:

Возвращает набор символов, содержащий символы в категории знаков препинания. Неофициально этот набор представляет собой набор всех небелых символов, используемых для разделения лингвистических единиц в сценариях, таких как периоды, тире, круглые скобки и т.д.

@Tapani Делает отличное предложение: NSCharacterSet.decimalDigitCharacterSet().invertedSet

Ответ 9

Вот решение @Tapani Swift 3.2

let phno = contact.phoneNumbers[0].phoneNumber
let strarr = phno.components(separatedBy: NSCharacterSet.decimalDigits.inverted)
let newString = NSArray(array: strarr).componentsJoined(by: "")
print(newString)

Ответ 10

Я нашел лучшее решение с функцией фильтра. Пожалуйста, посмотрите на это.

let string = "(555) 555-5555"

let onlyDigits = string.filter({ (char) -> Bool in

    if Int("\(char)") != nil {

        return true
    }
    else {

        return false
    }

})

Ответ 11

Точно не ответил, но выглядит как число. Я использовал URLComponents для построения URL, потому что он удаляет круглые скобки и автоматически разбивает:

var telUrl: URL? {
            var component = URLComponents()
            component.scheme = "tel"
            component.path = "+49 (123) 1234 - 56789"
            return component.url
        }

затем

UIApplication.shared.open(telUrl, options: [:], completionHandler: nil)

звонки +49 123 123456789