Ich habe dieses Problem: Ich habe ein String
, aber ich muss sicherstellen, dass es nur Buchstaben AZ und Zahlen 0-9
Aber was ist der beste und effizienteste Weg, um es zu implementieren?
Da sich noch niemand um "Schnellste" gekümmert hat, hier ist mein Beitrag:
%Vor%Vollständiger Testcode unten:
%Vor%Erzeugt diese Ausgabe für mich:
%Vor% Wenn Sie Regex vermeiden möchten, dann Character
Klasse kann helfen:
Wenn es Ihnen wichtig ist, Großbuchstaben zu verwenden, dann tun Sie stattdessen die if-Anweisung:
%Vor%Zusätzlich zu all den anderen Antworten, hier ist ein Guava-Ansatz:
%Vor%Mehr zu CharMatcher: Ссылка
Verwenden Sie einen regulären Ausdruck :
%Vor% [\dA-Z]+
: Mindestens ein Vorkommen (+) von Ziffern oder Großbuchstaben.
Wenn Sie Kleinbuchstaben einfügen möchten, ersetzen Sie [\dA-Z]+
durch [\dA-Za-z]+
.
Der folgende Weg ist nicht so schnell wie der zu implementierende reguläre Ausdruck, ist aber eine der effizientesten Lösungen (denke ich), weil er bitweise Operationen verwendet, die wirklich schnell sind.
Meine Lösung ist komplexer und schwieriger zu lesen und zu warten, aber ich denke, es ist ein weiterer einfacher Weg, um das zu tun, was Sie wollen.
Eine gute Möglichkeit zu testen, dass eine Zeichenfolge nur Zahlen oder Großbuchstaben enthält, ist eine einfache 128 bits bitmask
(2 Longs), die die ASCII-Tabelle darstellt.
Also, für die Standard-ASCII-Tabelle gibt es eine 1 für jedes Zeichen, das wir behalten möchten (Bit 48 bis 57 und Bit 65 bis 90)
So können Sie testen, ob ein Zeichen ein:
ist0x3FF000000000000L
(wenn der Zeichencode & lt; 65) 0x3FFFFFFL
(wenn der Zeichencode & gt; = 65) Also sollte die folgende Methode funktionieren:
%Vor%Der beste Weg im Sinne von Wartbarkeit und Einfachheit ist der bereits gepostete reguläre Ausdruck. Sobald Sie diese Technik kennen, wissen Sie, was zu erwarten ist, und es ist sehr einfach, die Kriterien bei Bedarf zu erweitern. Nachteil ist die Leistung.
Der schnellste Weg ist der Array-Ansatz. Überprüfen, ob der numerische Wert eines Charakters in den gewünschten Bereich fällt ASCII A-Z und 0-9 ist fast Lichtgeschwindigkeit. Aber die Wartbarkeit ist schlecht. Einfachheit ist weg.
Sie könnten java 7 und switch case mit char verwenden, aber das ist genauso schlimm wie das zweite.
Am Ende, da wir über Java sprechen, würde ich dringend empfehlen, reguläre Ausdrücke zu verwenden.
StringUtils in Apache Commons Lang 3 hat eine Methode containsOnly, Ссылка
Die Implementierung sollte schnell genug sein.