Ich habe einen NSString (Telefonnummer) mit einigen Klammern und Bindestrichen, da einige Telefonnummern formatiert sind. Wie würde ich alle Zeichen außer Zahlen aus der Zeichenfolge entfernen?
objective-c
nsstring
Ben Harris
quelle
quelle
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]
nicht funktioniert?[NSCharacterSet decimalDigitCharacterSet]
anderes ersetzen , das nur Zahlen und Buchstaben enthält. Sie können ein Konstrukt durch eine ErstellungNSMutableCharaterSet
und Weitergabe eindecimalDigitCharacterSet
,uppercaseLetterCharacterSet
undlowercaseLetterCharacterSet
zuformUnionWithCharacterSet:
. Beachten Sie, dass diesletterCharacterSet
auch Markierungen enthält, daher die Verwendung von Versionen in Klein- und Großbuchstaben.Es ist nicht erforderlich, eine Bibliothek mit regulären Ausdrücken zu verwenden, wie aus den anderen Antworten hervorgeht - die Klasse, nach der Sie suchen, wird aufgerufen
NSScanner
. Es wird wie folgt verwendet:BEARBEITEN: Ich habe den Code aktualisiert, weil das Original von oben auf meinen Kopf geschrieben wurde und ich dachte, es würde ausreichen, um die Leute in die richtige Richtung zu weisen. Es scheint, dass die Leute nach Code suchen, den sie einfach kopieren und direkt in ihre Anwendung einfügen können.
Ich stimme auch zu, dass die Lösung von Michael Pelz-Sherman besser geeignet ist als die Verwendung
NSScanner
. Vielleicht möchten Sie sich das ansehen.quelle
Die akzeptierte Antwort ist übertrieben für das, was gefragt wird. Das ist viel einfacher:
quelle
Das ist großartig, aber der Code funktioniert bei mir auf dem iPhone 3.0 SDK nicht.
Wenn ich strippedString so definiere, wie Sie es hier zeigen, erhalte ich eine
BAD ACCESS error
beim Versuch, es nach demscanCharactersFromSet:intoString
Aufruf zu drucken angezeigt.Wenn ich es so mache:
Am Ende habe ich eine leere Zeichenfolge, aber der Code stürzt nicht ab.
Ich musste stattdessen auf das gute alte C zurückgreifen:
quelle
Obwohl dies eine alte Frage mit funktionierenden Antworten ist, habe ich die Unterstützung für internationale Formate verpasst . Basierend auf der Lösung von Simonobo enthält der geänderte Zeichensatz ein Pluszeichen "+". Auch internationale Telefonnummern werden von dieser Änderung unterstützt.
Die Swift-Ausdrücke sind
Dies ergibt +12345671000 als allgemeines internationales Telefonnummernformat.
quelle
Hier ist die Swift-Version davon.
quelle
Schnelle Version der beliebtesten Antwort:
Edit: Syntax für Swift 2
Edit: Syntax für Swift 3
quelle
Danke für das Beispiel. Es fehlt nur eines, das Inkrement der scanLocation, falls eines der Zeichen in originalString nicht im Zeichen CharacterSet-Objekt gefunden wird. Ich habe eine else {} -Anweisung hinzugefügt, um dies zu beheben.
quelle
Es akzeptiert nur Handynummer
quelle
Es kann erwähnenswert sein, dass die akzeptierte
componentsSeparatedByCharactersInSet:
undcomponentsJoinedByString:
basierte Antwort keine speichereffiziente Lösung ist. Es reserviert Speicher für den Zeichensatz, für ein Array und für eine neue Zeichenfolge. Selbst wenn es sich nur um temporäre Zuweisungen handelt, kann die Verarbeitung vieler Zeichenfolgen auf diese Weise den Speicher schnell füllen.Ein speicherfreundlicherer Ansatz wäre, eine veränderbare Kopie der vorhandenen Zeichenfolge zu bearbeiten. In einer Kategorie über NSString:
Die Profilerstellung der beiden Ansätze hat gezeigt, dass etwa 2/3 weniger Speicher benötigt wird.
quelle
Sie können reguläre Ausdrücke für veränderbare Zeichenfolgen verwenden:
quelle
Entwickelte die Top-Lösung als Kategorie, um bei umfassenderen Problemen zu helfen:
Schnittstelle:
Implementierung:
Verwendung:
quelle
Swift 3
quelle
schnell 4.1
quelle
Äh. Die erste Antwort scheint mir völlig falsch. NSScanner ist wirklich zum Parsen gedacht. Im Gegensatz zu Regex müssen Sie die Zeichenfolge jeweils um einen winzigen Block analysieren. Sie initialisieren es mit einer Zeichenfolge und es wird ein Index darüber beibehalten, wie weit es entlang der Zeichenfolge gekommen ist. Dieser Index ist immer sein Referenzpunkt, und alle Befehle, die Sie ihm geben, beziehen sich auf diesen Punkt. Sie sagen: "Okay, geben Sie mir den nächsten Teil der Zeichen in diesem Satz" oder "Geben Sie mir die Ganzzahl, die Sie in der Zeichenfolge finden". Diese beginnen am aktuellen Index und bewegen sich vorwärts, bis sie etwas finden, das dies nicht tut Spiel. Wenn das allererste Zeichen bereits nicht übereinstimmt, gibt die Methode NO zurück und der Index wird nicht erhöht.
Der Code im ersten Beispiel durchsucht "(123) 456-7890" nach Dezimalzeichen, was bereits ab dem ersten Zeichen fehlschlägt. Daher ruft der Aufruf von scanCharactersFromSet: intoString: den übergebenen strippedString in Ruhe und gibt NO zurück. Der Code ignoriert die Überprüfung des Rückgabewerts vollständig und lässt den strippedString nicht zugewiesen. Selbst wenn das erste Zeichen eine Ziffer wäre, würde dieser Code fehlschlagen, da er nur die Ziffern zurückgibt, die er bis zum ersten Strich oder Paren oder was auch immer findet.
Wenn Sie NSScanner wirklich verwenden möchten, können Sie so etwas in eine Schleife einfügen und weiter nach einem NO-Rückgabewert suchen. Wenn Sie dies erhalten, können Sie den scanLocation erhöhen und erneut scannen. und Sie müssen auch isAtEnd und yada yada yada überprüfen. Kurz gesagt, falsches Werkzeug für den Job. Michaels Lösung ist besser.
quelle
Für diejenigen, die nach Telefonextraktion suchen, können Sie die Telefonnummern mit NSDataDetector aus einem Text extrahieren, zum Beispiel:
`
quelle
Ich habe eine Kategorie in NSString erstellt, um diesen allgemeinen Vorgang zu vereinfachen.
NSString + AllowCharactersInSet.h
NSString + AllowCharactersInSet.m
quelle
Ich denke derzeit ist der beste Weg:
quelle
Wenn Sie nur versuchen, die Zahlen aus der Zeichenfolge zu entnehmen , können Sie sie auch mit regulären Ausdrücken analysieren. Informationen zum Ausführen von Regex in Objective-C finden Sie in RegexKit .Bearbeiten: Wie @Nathan hervorhebt, ist die Verwendung von NSScanner eine viel einfachere Möglichkeit, alle Zahlen aus einer Zeichenfolge zu analysieren. Ich war mir dieser Option überhaupt nicht bewusst, also bitte ich ihn, sie vorzuschlagen. (Ich mag es nicht einmal, Regex selbst zu verwenden, deshalb bevorzuge ich Ansätze, die sie nicht erfordern.)Wenn Sie Telefonnummern für die Anzeige formatieren möchten, sollten Sie sich NSNumberFormatter ansehen . Ich schlage vor, dass Sie diese verwandte SO-Frage lesen , um Tipps dazu zu erhalten. Denken Sie daran, dass Telefonnummern je nach Standort und / oder Gebietsschema unterschiedlich formatiert sind.
quelle
Swift 5
quelle
Basierend auf Jon Vogels Antwort hier handelt es sich um eine Swift String-Erweiterung zusammen mit einigen grundlegenden Tests.
Und einige Tests, die zumindest grundlegende Funktionen belegen:
Dies beantwortet die Frage des OP, kann jedoch leicht geändert werden, um telefonnummernbezogene Zeichen wie ",; * # +" zu belassen.
quelle
];
Halte es einfach!
quelle