web-dev-qa-db-ja.com

文字列から非数字をフィルタリング

Swiftコードのみを使用すると、「(555)555-5555」を取得して数値のみを返し、「5555555555」を取得する方法がわかりません。すべての括弧、空白を削除する必要があります。 、そしてダッシュ。私が見つけることができる唯一の例はobjective-Cにあり、それらはすべて.trim()メソッドを使用しているようです。Swiftにはこのメソッドはありませんが、 .stringByTrimmingCharactersメソッドがありますが、それはデータの前後の空白のみを切り取るようです。

40
Jeff Dicket

Swift 3および4:

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

文字列を数字以外の文字で数字の配列に分割し、それらを結合して文字列に戻します。

スイフト1:

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

Swift 2:

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

Swift 3&4:

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

私は正規表現が好きです:

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

これが@TapaniのSwift 2.0の便利な文字列拡張としての答えです(長さのプロパティは解決策の一部ではありませんが、手頃なため例に残しました):

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())
9
Brian Ogden

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
5
werediver

同様の問題がありましたが、小数点を保持する必要がありました。私はこれに対するトップアンサーを微調整しました:

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()
    }
}
2
Mark Bridges

詳細

  • Xcodeバージョン10.2.1(10E1001)、Swift 5

溶液

import Foundation

extension String {

    private func filterCharacters(unicodeScalarsFilter closure: (UnicodeScalar) -> Bool) -> String {
        return String(String.UnicodeScalarView(unicodeScalars.filter { closure($0) }))
    }

    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 filterCharacters { 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
2

NSCharacterSetを使用する必要があります。

SwiftおよびObj-C実装: http://nshipster.com/nscharacterset/ については、このNSHipsterリンクを確認してください。

同様の例:

_var string = "  Lorem    ipsum dolar   sit  amet. "

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

string = join(" ", components)
_

参照:punctuationCharacterSet

説明:

句読点のカテゴリの文字を含む文字セットを返します。非公式には、このセットは、ピリオド、ダッシュ、括弧など、スクリプト内の言語単位を区切るために使用されるすべての非空白文字のセットです。

@ Tapani すばらしい提案:NSCharacterSet.decimalDigitCharacterSet().invertedSet

1
NSWill

@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)
0
Sabrina Tuli

正確には答えられていませんが、数字のように見えます。 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

0
mbnz

フィルター機能で最適なソリューションを見つけました。ご覧ください。

let string = "(555) 555-5555"

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

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

        return true
    }
    else {

        return false
    }

})
0
Naresh