2015-06-12 15 views
6

Sto provando ad abbinare una stringa in Java con String.matches().Come abbinare un carattere in mezzo o alla fine della stringa ma solo una volta

valori accettati sono

  • ABC321,
  • ABC321/OTHER888
  • o ABC321/

ma

  • /ABC321
  • o ABC321/O THER888/

non corrisponde.

Quindi / potrebbe trovarsi al centro o alla fine della stringa ma non all'inizio e dovrebbe apparire solo una volta.

Questa è l'espressione regolare più vicina che sono riuscito a fare:

myString.matches("^[A-Za-z0-9]+/?[A-Za-z0-9]+/?$"); 

ma il problema è che/può apparire più volte. Quindi, come posso migliorare la regex per consentire/una sola volta?

risposta

6

Il problema con l'espressione regolare è che si consente / almeno 2 volte con /?.

È necessario consentire solo il / una volta.

^[A-Za-z0-9]+/?[A-Za-z0-9]*$ 

Inoltre, matches richiede una corrispondenza stringa completa, non c'è bisogno di usare ^ e $ ancore in questa regex se solo si prevede di utilizzarlo con matches.

Vedi IDEONE demo

System.out.println("ABC321".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*")); 
System.out.println("ABC321/OTHER888".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*")); 
System.out.println("ABC321/".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*")); 
System.out.println("/ABC321".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*")); 
System.out.println("ABC321/OTHER888/".matches("[A-Za-z0-9]+/?[A-Za-z0-9]*")); 

uscita:

true 
true 
true 
false 
false 
0

Questa espressione regolare lavorerà

^[A-Za-z0-9]+\/{0,1}[A-Za-z0-9]*$ 

{0,1} garantisce comparsa di '/' minimo 0 volte e massimo 1 volta.

0

userei uno sguardo negativo avanti per far valere solo 1 barra, e mantenere il semplice riposo:

if (str.matches("(?!.*/.*/)\\w[\\w/]+")) 

See (equivalente) live demo.

Problemi correlati