2012-07-26 10 views
30

He siguientes líneas de códigoComo llegar grupo similar de expresiones regulares valores

String time = "14:35:59.99"; 
String timeRegex = "(([01][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])(.([0-9]{1,3}))?"; 
String hours, minutes, seconds, milliSeconds; 
Pattern pattern = Pattern.compile(timeRegex); 
Matcher matcher = pattern.matcher(time); 
if (matcher.matches()) { 
    hours = matcher.replaceAll("$1"); 
    minutes = matcher.replaceAll("$4"); 
    seconds = matcher.replaceAll("$5"); 
    milliSeconds = matcher.replaceAll("$7"); 
} 

Me estoy haciendo horas, minutos, segundos y milisegundos utilizando el método matcher.replace y referencias anteriores de grupos de expresiones regulares. ¿Hay algún método mejor para obtener valor de los grupos regex? Probé

hours = matcher.group(1); 

pero desencadena la siguiente excepción:

java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:477) 
    at com.abnamro.cil.test.TimeRegex.main(TimeRegex.java:70) 

Me estoy perdiendo algo aquí?

+1

Solo para estar seguro, todavía está revisando 'matcher.matches() == True' primero, ¿verdad? –

Respuesta

43

Funciona bien si evita llamar a matcher.replaceAll. Cuando llamas al replaceAll, olvida cualquier coincidencia anterior.

String time = "14:35:59.99"; 
String timeRegex = "([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\\.([0-9]{1,3}))?"; 
Pattern pattern = Pattern.compile(timeRegex); 
Matcher matcher = pattern.matcher(time); 
if (matcher.matches()) { 
    String hours = matcher.group(1); 
    String minutes = matcher.group(2); 
    String seconds = matcher.group(3); 
    String miliSeconds = matcher.group(4); 
    System.out.println(hours + ", " + minutes + ", " + seconds + ", " + miliSeconds); 
} 

Tenga en cuenta que también he hecho un par de mejoras a su expresión regular:

  • He usado los grupos no capturar (?: ...) para los grupos que no están interesados ​​en la captura.
  • He cambiado . que coincide con cualquier carácter a \\. que solo coincide con un punto.

ver su funcionamiento en línea: ideone

5

Funciona si utiliza matcher.find() antes de llamar a la función de grupo.

+0

tengo una situación donde 'find' devuelve verdadero pero los grupos arrojan una excepción – dopatraman

Cuestiones relacionadas