2015-08-20 12 views
6

Ich möchte eine Zeichenfolge, die entweder KH1 oder KH2 oder KH99 sein kann.Regulärer Ausdruck, um genaues Zeichen und Zahlen zu entsprechen

ich,

public class Test1 { 

public static void main(String[] args) { 
    String name = "KH1"; 
    if(name.matches("[[K][H][1-9][0-9]]") || name.matches("[[K][H][1-9]]")){ 
     System.out.println("VALID NAME"); 
    }else{ 
     System.out.println("INVALID NAME"); 
    } 
} 
} 

Es doesnot Arbeit. Ich bekomme INVALID NAME.

Was ist der richtige Weg dafür?

+3

Zeigen Sie uns Ihre Eingabe bitte – MrT

+0

Bitte überprüfen Sie die Frage. – Raj

Antwort

8

die äußeren eckigen Klammern entfernen:

if(name.matches("[K][H][1-9][0-9]?")){ 

Siehe IDEONE demo

Das Problem ist, dass Sie das gesamte Muster in eine Zeichenklasse mit äußeren [...], und alle Symbole im Inneren eingeschlossen (mit Ausnahme der Klammern) wurden als einzelne Literalsymbole behandelt und der gesamte Ausdruck konnte nur 1 Zeichen entsprechen.

Über Optimierungen sprechen: Der Wechsel ist hier nicht wirklich notwendig, da Sie ? quantifier auf die Klasse [0-9] anwenden können, um es optional zu machen. ? entspricht 0 oder 1 Vorkommen des vorhergehenden Untermusters.

Beachten Sie auch, dass [K][H] Sinn macht, wenn Sie planen, um weitere Optionen in die Zeichenklassen hinzufügen, sonst könnten Sie auch

if(name.matches("KH[1-9][0-9]?")){ 

oder

if(name.matches("KH[1-9]\\d?")){ 

Die \d verwenden ist ein shorthand class die passt Ziffer (n).

+0

Ich hoffe es ist jetzt ganz klar. Wenn Sie noch Zweifel haben, zögern Sie nicht, einen Kommentar abzugeben. Beachten Sie, dass mit * (außer den Klammern) * ich meine, dass die '[' und ']' innerhalb des äußeren '[...]' von der Java-Regex-Engine ignoriert werden. –

+1

Sehr klar jetzt. Vielen Dank. Aber ich kann die Antwort nur nach 5 Minuten annehmen. – Raj

+1

Für Erklärung +1 –

3

Sie können einzelne Regex verwenden.

if(name.matches("KH(?:[1-9]\\d|[1-9])")) { 
4

Zunächst sind diese äußeren eckigen Klammern falsch. Entferne sie. Zweitens kann Ihr regulärer Ausdruck vereinfacht werden viel. Sie benötigen weder zwei separate Ausdrücke, noch müssen Sie die einzelnen Zeichen K und H in einer Zeichenklasse einschließen. Versuchen:

KH[1-9][0-9]? 

Dies wird die wörtliche Zeichen übereinstimmen KH, gefolgt von einer Ziffer von 1 bis 9 und gegebenenfalls eine weitere Ziffer von 0 bis 9 - durch die folgenden Rechts Saiten dargestellt:

KH1 
KH2 
... 
KH8 
KH9 
KH10 
KH11 
... 
KH18 
KH19 
KH20 
KH21 
... 
KH98 
KH99 
+0

Ich habe einige Verwirrung mit der Frage haben kann wir versuchen so KH \ d + – Raghavendra

+0

@raghavendra Ich denke nein. Wir können nicht wie OP bereits definiert, dass er die Ganzzahl Wert von 1 und bis 99 nur –

+1

@NarendraSisodia ok verstanden danke ich denke, wie diese nur Eingaben sind – Raghavendra

Verwandte Themen