2011-07-26 13 views
9

tengo cadenas, como a continuación:de expresiones regulares - La captura de todos los grupos de repetición

@[email protected] text [email protected]@another optional text here etc 

que contiene @[email protected] cuerdas en el interior.

Me gustaría capturar todas estas "variables" en grupos mediante una coincidencia de expresiones regulares, pero parece que no es posible, ya que la expresión regular solo devuelve el último grupo capturado mientras se repite.

+0

Tenga cuidado, es posible que desee '@ [^ @] + @' en lugar de '@. + @' – sidyll

+0

Olvidé poner la versión correcta, debe ser "@. +? @ –

Respuesta

17

Tienes razón; la mayoría de los sabores de expresiones regulares, incluido Java, no permiten el acceso a coincidencias individuales de un grupo de captura repetido. (Perl 6 y .NET permiten esto, para el registro, pero eso no te ayuda).

¿Qué más puedes hacer?

Pattern regex = Pattern.compile("@[^@][email protected]"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    // matched text: regexMatcher.group() 
    // match start: regexMatcher.start() 
    // match end: regexMatcher.end() 
} 

que capturará @[email protected], etc. @[email protected] uno por uno.

2

Si sabe que el separador será @, ¿por qué no simplemente utiliza el método split (string.split('@'))?

+0

No es un separador es una start/end "tag" de la propiedad/marcador de posición –

+0

Bueno, en ese caso, ¿no podría hacer la 'división' de todos modos, atravesar la matriz resultante y capturar los nombres de las propiedades y el texto opcional? –

+0

¿Cómo puede saber en ejemplos a continuación? cuál es la propiedad y cuál es un texto: "@ property @ text" y "text @ property". Split le da ["propiedad", "texto"] o ["texto", propiedad "]. –

Cuestiones relacionadas