2015-08-20 2 views
6

Voglio abbinare una stringa che può essere sia KH1 o KH2 o ... KH99.Espressione regolare per abbinare caratteri e numeri esatti

ho fatto,

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

doesnot lavoro. Ottengo INVALID NAME.

Qual è il modo corretto per questo?

+3

mostraci il tuo contributo per favore – MrT

+0

Si prega di verificare la domanda. – Raj

risposta

8

Rimuovere le esterne parentesi quadre:

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

Vedi IDEONE demo

Il problema è che si racchiuso l'intero modello in una classe di caratteri con esterno [...], e tutti i simboli all'interno (tranne le parentesi) sono stati trattati come simboli singoli letterali e l'intera espressione poteva corrispondere solo a 1 carattere.

Parlando di ottimizzazioni: qui l'alternanza non è realmente necessaria in quanto è possibile applicare ? quantifier alla classe [0-9] per renderla opzionale. ? corrisponde a 0 o 1 occorrenza del subpattern precedente.

Si noti inoltre che [K][H] ha un senso se si prevede di aggiungere ulteriori opzioni nelle classi di personaggi, altrimenti si potrebbe anche usare

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

o

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

Il \d è un shorthand class che corrisponde cifre (s).

+0

Spero che ora sia abbastanza chiaro. Se hai ancora dubbi, non esitare a lasciare un commento. Si noti che per * (eccetto le parentesi) * intendo che '[' e ']' all'interno del '[...]' esterno vengono ignorati dal motore regex Java. –

+1

Molto chiaro ora. Grazie. Ma posso solo accettare la risposta dopo 5 minuti. – Raj

+1

Per la spiegazione +1 –

3

È possibile utilizzare una singola espressione regolare.

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

Prima di tutto quelle parentesi quadre esterne non sono corrette. Rimuovili. In secondo luogo, la tua espressione regolare può essere semplificata molto. Non sono necessarie due espressioni separate, né è necessario includere i caratteri singoli K e H in una classe di caratteri. Prova:

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

Ciò corrispondere ai caratteri letterali KH, seguito da una cifra da 1 a 9, e eventualmente un altro cifre da 0 a 9 - illustrato dalle seguenti stringhe di legge:

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

ho una certa confusione con la domanda proviamo in questo modo KH \ d + – Raghavendra

+0

@raghavendra Penso di no. Non possiamo come OP ha già definito che vuole il valore intero a partire da 1 e fino a 99 solo –

+1

@NarendraSisodia ok capito grazie, penso che quelli siano solo input – Raghavendra