webentwicklung-frage-antwort-db.com.de

Nicht-Ziffern aus Zeichenfolge filtern

Mit nur Swift-Code kann ich nicht herausfinden, wie man "(555) 555-5555" nimmt und nur die numerischen Werte zurückgibt und "5555555555" erhält. Ich muss alle Klammern, Leerzeichen und den Bindestrich entfernen. Die einzigen Beispiele, die ich finden kann, sind in Objective-C, und alle scheinen die .trim () -Methode zu verwenden. Es scheint, als hätte Swift diese Methode nicht, aber es hat die .stringByTrimmingCharacters-Methode, aber das scheint nur die Leerzeichen vor und hinter den Daten zu beschneiden. 

34
Jeff Dicket

Swift 3 & 4:

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

Teilen Sie die Zeichenfolge nach nicht-stelligen Zeichen in ein Zahlenfeld auf und verbinden Sie sie wieder zu einer Zeichenfolge:

Swift 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: "")
45
Tapani

Ich mag reguläre Ausdrücke:

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

Hier ist @ Tapanis Antwort auf Swift 2.0 als praktische String-Erweiterung (Längeseigenschaft ist nicht Teil der Lösung, aber ich habe sie im Beispiel gelassen, da sie auch praktisch ist)

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
    }

}

Verwendungszweck:

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

In Swift 4 ist die Lösung schöner:

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

Einzelheiten

xCode 8.2.1, Swift 3

Idee

Zeichensätze aus String entfernen

Filtern Sie die Zeichenfolge in Swift

import Foundation

extension String {

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

    private func removeCharacters(from charSets: [CharacterSet], unicodeScalarsFilter: (CharacterSet, UnicodeScalar) -> Bool) -> String {
        return removeCharacters{ unicodeScalar in
            for charSet in charSets {
                let result = unicodeScalarsFilter(charSet, unicodeScalar)
                if result {
                    return true
                }
            }
            return false
        }
    }

    func removeCharacters(charSets: [CharacterSet]) -> String {
        return removeCharacters(from: charSets) { charSet, unicodeScalar in
            !charSet.contains(unicodeScalar)
        }
    }

    func removeCharacters(charSet: CharacterSet) -> String {
        return removeCharacters(charSets: [charSet])
    }

    func onlyCharacters(charSets: [CharacterSet]) -> String {
        return removeCharacters(from: charSets) { charSet, unicodeScalar in
            charSet.contains(unicodeScalar)
        }
    }

    func onlyCharacters(charSet: CharacterSet) -> String {
        return onlyCharacters(charSets: [charSet])
    }
}

Verwendungszweck

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 [.decimalDigits, .symbols]:     \(string.onlyCharacters(charSets: [.decimalDigits, .symbols]))")
print("remove .decimalDigits:               \(string.removeCharacters(charSet: .decimalDigits))")
print("remove [.decimalDigits, .symbols]:   \(string.removeCharacters(charSets: [.decimalDigits, .symbols]))")

Ergebnis

 enter image description here

Erweiterung für den Code oben

Eine kleine Idee für den Erstellungsschnellfilter. Dies ist eine Erweiterung des oben beschriebenen Codes

Code-Erweiterung

extension String {

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

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

Verwendung der Code-Erweiterung

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)")

Ergebnis der Code-Erweiterung

 enter image description here

1

Sie möchten NSCharacterSet verwenden: 

Schauen Sie sich diesen NSHipster-Link für Swift- und Obj-C-Implementierungen an: http://nshipster.com/nscharacterset/

Ähnliches Beispiel:

var string = "  Lorem    ipsum dolar   sit  amet. "

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

string = join(" ", components)

Siehe: punctuationCharacterSet

Beschreibung:

Gibt einen Zeichensatz zurück, der die Zeichen in der Kategorie "Interpunktion" enthält. Informell ist dieser Satz die Menge aller Nicht-Whitespace-Zeichen, die zum Trennen von Spracheinheiten in Skripts verwendet werden, z. B. Punkte, Bindestriche, Klammern usw.

@Tapani Macht einen tollen Vorschlag: NSCharacterSet.decimalDigitCharacterSet().invertedSet

1
NSWill

Ich hatte ein ähnliches Problem, musste jedoch die Dezimalstellen beibehalten. Ich habe die beste Antwort darauf angepasst:

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

Hier ist @Tapani Swift 3.2 Lösung

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

Nicht genau beantwortet, aber es sieht aus wie eine Zahl ... Ich habe URLComponents verwendet, um die URL zu erstellen, da Klammern und Bindestriche automatisch entfernt werden:

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

dann 

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

anrufe +49 123 123456789

0
mbnz

Ich habe die beste Lösung mit Filterfunktion gefunden. Bitte werfen Sie einen Blick darauf.

let string = "(555) 555-5555"

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

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

        return true
    }
    else {

        return false
    }

})
0
Naresh