2012-04-14 16 views
5

Soy nuevo en la codificación de Android, pero tengo experiencia con Perl regex. tenemos que asociar una lista de 0 o más identificadores con una expresión regular como:Referencia a grupos coincidentes anteriores dentro de una expresión regular

^\s*((\w\d\d\d)(\s+$2)*)?$ 

Nota del $ 2 se refiere al grupo de referencia anterior (\ w \ d \ d \ d) Para el código de Android que lo haría se ven como:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\$2)*)?$") 

Eclipse compilador no compilar los \ $ 2, he intentado también \ 2, que compila pero intenta hacer coincidir un número literal 2.

la solución de fuerza bruta sería repetir el identificador patrón:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+(\\w\\d\\d\\d))*)?$") 

que funciona, pero tiene las siguientes desventajas: * Es fácil cometer un error de sintaxis, ya sea en la repetición * como el identificador se complica la cadena se hace más grande * No es elegante * se vuelve mucho más complicado si necesita referirse no a uno sino a varias coincidencias anteriores

¿Hay alguna manera en Java de referirse a los grupos coincidentes anteriores dentro de la expresión regular?

+0

has intentado 'Pattern.compile ("^\\ s * ((\\ w \\ d \\ d \\ d) (\\ s + \\ 2) *)? $ ")' Creo que la referencia es \ N donde N es tu grupo. Aunque tiene que hacer una barra invertida en la barra inversa con '\\ N' –

+0

Sí, tengo el valor \\ 2 como literal 2 (se me olvidó duplicar la barra invertida en la publicación original, pero esto es lo que quise decir). – ilomambo

Respuesta

0

lo siento por la confusión, mi confusión. la expresión regular:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$") 

coincidirá con algo así como "A12 A12", por lo tanto, que coincide con el partido anterior. (Lo probé en Eclipse y lo seguí con el depurador)

Lo que quería es una forma de escribir una expresión regular corta para una cadena como "A12 B35 C36 A011" En Perl puede usar variables una parte de la patrón, por lo tanto, se puede hacer en perl:

$a='\w\d\d\d'; 
$mystring =~ /^\s*(($a(\s+$a)*)?$/; 

corto y simple. Por lo tanto asumí en Java también puede hacerse mediante la concatenación de cadenas (he intentado y funciona)

String id="\\w\\d\\d\\d"; 
Pattern.compile("^\\s*(" + id + "(\\s+" + id + ")*)?$"); 

No es elegante, pero hace el trabajo.

+1

En general, la mayoría de los lenguajes tratan la entrada a un compilador de expresiones regulares como _string_. Perl es una excepción: los regexen están integrados en el lenguaje tan completamente que realmente son parte del programa. – katrielalex

0

Recuerde que no solo se debe escapar el $, sino que se debe escapar al \.

por lo que necesita:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$") 
+0

Estaba equivocado, encontré lo que está mal con mi expresión regular. Podré publicar la respuesta en 7 horas (restricciones de novato) – ilomambo

Cuestiones relacionadas