2011-06-05 13 views
5

Tengo que volver a escribir una parte de un programa C#/.NET existente usando Java. No soy tan fluido en Java y me falta algo manejando expresiones regulares y solo quería saber si me falta algo o si Java simplemente no proporciona esa característica.Capturas Regex en Java como en C#

que tienen datos como

2011:06:05 15:50\t0.478\t0.209\t0.211\t0.211\t0.205\t-0.462\t0.203\t0.202\t0.212 

El patrón de expresión que estoy usando el siguiente aspecto:

?(\d{4}:\d{2}:\d{2} \d{2}:\d{2}[:\d{2}]?)\t((-?\d*(\.\d*)?)\t?){1,16} 

En .NET que puede acceder a los valores después de contrastar el uso de match.Group[3].Captures[i].

En Java no he encontrado nada de eso. matcher.group(3) simplemente devuelve una cadena vacía.

¿Cómo puedo lograr un comportamiento como el que estoy acostumbrado a utilizar desde C#?

+0

Los valores después qué? –

+0

Debería ser lo mismo. Compila tu patrón, combina, eso es todo. java regex es solo normal regex. Tengo la tentación de decir "verifique su entrada", etc. – Bohemian

+0

El problema es que al hacer un ajuste de grupo de valores múltiples, '(algo) *' o '(algo) {1,16}', Java solo devuelve el ÚLTIMO artículo en el ajuste. Así que supongo que en su caso, el grupo 1 es '2011: 06: 05 15: 50' y el grupo 2 es' 0.212' y eso es todo. – toto2

Respuesta

3

Como mencioné en los comentarios, Java solo devolverá el último valor de un ajuste de grupo de valores múltiples. Por lo que debe usar primera expresión regular para aislar la última parte de su cadena con los valores:

strg = "0.478\t0.209\t0.211\t0.211\t0.205\t-0.462\t0.203\t0.202\t0.212"

y luego simplemente dividir alrededor de las pestañas:

String[] values = strg.split("\\t");

+1

Sí, esa es mi solución temporal hasta ahora. También esperando una mejor solución ...;) – signpainter

+0

@signpainter: .NET y Perl 6 son las únicas implementaciones de expresiones regulares que actualmente admiten capturas de grupos repetidos. Entonces, no hay alternativa a esta solución si está usando Java. –