Java - Wie überprüfe ich am besten, ob ein STRING nur bestimmte Zeichen enthält?

8

Ich habe dieses Problem: Ich habe ein String , aber ich muss sicherstellen, dass es nur Buchstaben AZ und Zahlen 0-9 . Hier ist mein aktueller Code:

%Vor%

Aber was ist der beste und effizienteste Weg, um es zu implementieren?

    
Victor2748 24.10.2014, 19:58
quelle

8 Antworten

11

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%     
Michael Krause 24.10.2014, 21:03
quelle
9

Wenn Sie Regex vermeiden möchten, dann Character Klasse kann helfen:

%Vor%

Wenn es Ihnen wichtig ist, Großbuchstaben zu verwenden, dann tun Sie stattdessen die if-Anweisung:

%Vor%     
quelle
3

Sie könnten Apache Commons Lang verwenden:

%Vor%     
Christoph Lühr 24.10.2014 20:11
quelle
3

Zusätzlich zu all den anderen Antworten, hier ist ein Guava-Ansatz:

%Vor%

Mehr zu CharMatcher: Ссылка

    
Kirill Rakhman 26.10.2014 11:35
quelle
2

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]+ .

    
manouti 24.10.2014 20:00
quelle
2

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:

ist
  1. Nummer mit dieser Maske: 0x3FF000000000000L (wenn der Zeichencode & lt; 65)
  2. Großbuchstabe mit dieser Maske: 0x3FFFFFFL (wenn der Zeichencode & gt; = 65)

Also sollte die folgende Methode funktionieren:

%Vor%     
Pier-Alexandre Bouchard 28.10.2014 06:39
quelle
1

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.

    
Hannes 24.10.2014 20:27
quelle
0

StringUtils in Apache Commons Lang 3 hat eine Methode containsOnly, Ссылка

Die Implementierung sollte schnell genug sein.

    
Mikael Vandmo 15.01.2016 13:05
quelle

Tags und Links