2009-08-03 57 views
15

He esta cadenaJava - extraer cadenas con expresiones regulares

String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45"; 

y yo tenemos que extraer estos 3 subseries

06:30
07:45

Si uso este regex \\ d {2} \: \\ d {2} solo puedo extraer la primera hora 06:30

Pattern depArrHours = Pattern.compile("\\d{2}\\:\\d{2}"); 
Matcher matcher = depArrHours.matcher(myString); 
String firstHour = matcher.group(0); 
String secondHour = matcher.group(1); (IndexOutOfBoundException no Group 1) 

matcher.group (1) arroja una excepción.
También no sé cómo extraer 1234. Esta cadena puede cambiar pero siempre viene después de 'XX ~'
¿Tiene alguna idea sobre cómo hacer coincidir estas cadenas con expresiones de expresiones regulares?

ACTUALIZACIÓN

Gracias a Adam sugerencia He ahora esta expresión regular que coinciden con mi cadena

Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})"; 

que coincida con el número y las 2 horas con matcher.group (1); matcher.group (2); matcher.group (3);

+0

¿Puedes mostrar tu código? Eso debería coincidir con las 06:30, siempre que todo lo demás esté en orden. –

Respuesta

36

La función matcher.group() espera tomar un solo argumento entero: El índice del grupo de captura, comenzando desde 1. El índice 0 es especial, lo que significa "la coincidencia completa". Un grupo de captura se crea utilizando un par de paréntesis "(...)". Cualquier cosa dentro del paréntesis es capturas. Los grupos están numerados de izquierda a derecha (nuevamente, comenzando desde 1), al abrir paréntesis (lo que significa que los grupos pueden superponerse). Como no hay paréntesis en su expresión regular, no puede haber grupo 1.

El javadoc en la clase Pattern cubre la sintaxis de la expresión regular.

Si está buscando un patrón que pueda repetirse varias veces, puede usar Matcher.find() repetidamente hasta que devuelva falso. Matcher.group(0) una vez en cada iteración devolverá lo que coincide con ese momento.

Si desea construir una gran expresión regular que coincida con todo de una vez (que creo que es lo que desea), alrededor de cada uno de los tres conjuntos de cosas que desea capturar, coloque un conjunto de paréntesis de captura, use Matcher.match() y luego Matcher.group(n) donde n es 1, 2 y 3 respectivamente. Por supuesto, Matcher.match() también puede devolver falso, en cuyo caso el patrón no coincide y no puede recuperar ninguno de los grupos.

En su ejemplo, lo que probablemente desee hacer es hacer que coincida con el texto anterior, luego iniciar un grupo de captura, hacer coincidir los dígitos, finalizar el grupo de captura, etc. No sé lo suficiente acerca de su exacta formato de entrada, pero aquí hay un ejemplo.

digamos que tuve cadenas de la forma:

Eat 12 carrots at 12:30 
Take 3 pills at 01:15 

Y quería extraer la cantidad y tiempos.Mi expresión regular sería algo como:

"\w+ (\d+) [\w ]+ (\d{1,2}:\d{2})" 

El código sería algo como:

Pattern p = Pattern.compile("\\w+ (\\d+) [\\w ]+ (\\d{2}:\\d{2})"); 
Matcher m = p.matcher(oneline); 
if(m.matches()) { 
    System.out.println("The quantity is " + m.group(1)); 
    System.out.println("The time is " + m.group(2)); 
} 

La expresión regular significa "una cadena que contiene una palabra, un espacio, una o más dígitos (que son capturado en el grupo 1), un espacio, un conjunto de palabras y espacios que terminan en un espacio, seguido de un tiempo (capturado en el grupo 2, y el tiempo supone que la hora siempre tiene 0 dígitos en 2). un ejemplo más cercano a lo que está buscando, pero la descripción de la posible entrada es un poco vaga.

+1

Gracias Adam, estaba bastante confundido con la API de Matcher – mickthompson

+1

Hola Adam, el formato de mi entrada es siempre el mismo. Necesito extraer las 2 horas y el número después de la cadena XX ~ (1234 en el caso del ejemplo). Ese número puede ser de {3,4} dígitos. – mickthompson

+4

Espero que esto ayude a otros. ** Necesitas ** llamar a 'm.matches()' (o 'm.find()') antes de llamar a m.group(), de lo contrario, dirá que no hay coincidencias (porque no busca alguno todavía), al menos esto es lo que sucede en Android. –

Cuestiones relacionadas