2011-10-07 24 views
12

Vorrei provare se una stringa termina con una cifra. Mi aspetto che la seguente riga Java stampi true. Perché stampa falso?Regex per verificare se una stringa termina con un numero

System.out.println("I end with a number 4".matches("\\d$")); 
+0

questo può anche essere legato alla tua domanda: http://stackoverflow.com/questions/627545/java-regexp-problem-www-vs-www – AdrianoKF

risposta

8

In Java Regex, c'è una differenza tra Matcher.find() (trovare una corrispondenza in qualsiasi parte del String) e Matcher.matches() (corrispondere l'intera stringa).

String ha solo un metodo matches() (implementato equivalente a questo codice: Pattern.compile(pattern).matcher(this).matches();), quindi è necessario per creare un modello che corrisponde al pieno String:

System.out.println("I end with a number 4".matches("^.*\\d$")); 
+0

In realtà, più semplicemente: System.out.println ("I end with a number 4" .matches (". * \\ d")); ma il '$' dovrebbe significare che non devo specificare. * All'inizio. Perché "$" alla fine non funziona? – Thor

+0

Il backspace extra rimuove il comportamento di escape. Quindi "^. * \\ d $" potrebbe non funzionare. Puoi testarlo nei tester di regex online come questo: http://www.regexplanet.com/simple/index.html – Kash

+0

@Kash in Java, è necessario il backspace aggiuntivo –

15

tua espressione regolare non corrisponderà l'intera stringa, ma solo l'ultima parte. Prova il codice qui sotto e dovrebbe funzionare bene in quanto corrisponde all'intera stringa.

System.out.println("I end with a number 4".matches("^.+?\\d$")); 

È possibile verificare questo per un rapido controllo sui tester regex in linea come questo: http://www.regexplanet.com/simple/index.html. Questo ti dà anche ciò che dovresti usare nel codice Java nei risultati con gli escape appropriati.

Il . + assicurerà che vi sia almeno un carattere prima della cifra. Il ? assicurerà che faccia una partita pigra invece di una partita avida.

+0

In questo caso, non c'è motivo di fare una corrispondenza pigra. Noi * vogliamo * il '. +' Per divorare subito l'intera stringa. Quindi tornerà indietro di una posizione per confrontare l'ultimo carattere con '\ d', che è l'unica cosa che ci interessa. –

-1

provare questo:

System.out.println("I end with a number 4".matches(".*\\d\$")); 
+0

Non verrà compilato, '\ $' è illegale in Java –

1
System.out.println("I end with a number 4".matches(".*\\d")); // prints true 

o

String s = "I end with a number 4"; 
System.out.println(Character.isDigit(s.charAt(s.length()-1))); // prints true 
2

tua espressione RegEx è slightly off. Prova questo:

System.out.println("I end with a number 4".matches("^.*\\d$")); 

Si può anche semplicemente verificare come questo se si sta valutando una riga alla volta:.

System.out.println("I end with a number 4".matches(".*\\d")); 

tua espressione originale, senza * solo testato per vedere se la stringa è stata una numero e non ha tenuto conto del testo che può precedere quel numero. Ecco perché è sempre stato falso.

Quanto segue non restituiscono vero:

System.out.println("4".matches("^\\d$")); 
Problemi correlati