2010-04-21 29 views
5

Esta es mi prueba de cuerdas:RegEx avanzada: Positivo de búsqueda hacia atrás

<img rel="{objectid:498,newobject:1,fileid:338}" width="80" height="60" align="left" src="../../../../files/jpg1/Desert1.jpg" alt="" /> 

quiero conseguir cada uno de los elementos JSON formados entre medio del atributo rel. Está funcionando para el primer elemento (objectid).

Aquí es mi ReqEx, que funciona bien:

(?<=(rel="\{objectid:))\d+(?=[,|\}]) 

pero quiero hacer algo como esto, lo que no funciona:

(?<=(rel="\{.*objectid:))\d+(?=[,|\}]) 

por lo que puedo analizar cada elemento de la cadena de búsqueda.

estoy usando Java-ReqEx

Respuesta

0

búsquedas hacia delante y lookbehinds no pueden contener expresiones regulares arbitrarias en general: La mayoría de los motores (Java está incluido) requieren que su longitud es bien conocido por lo que no puede utilizar los cuantificadores como * en ellos.

¿Por qué estás usando lookaheads y lookbehinds aquí, de todos modos? Solo use grupos de captura, eso es mucho más simple.

rel="\{.*objectid:(\d+) 

Ahora, el primer grupo de captura contendrá la ID.

+0

No realmente. La repetición infinita no es un problema para el futuro, solo para mirar hacia atrás. –

2

Java (y casi todos los sabores de expresiones regulares excepto .NET y JGSoft) no admiten la repetición infinita dentro de lookbehinds.

Puede usar grupos de captura en su lugar. Además, mejor utilice [^{]* en lugar de .*, y asegúrese de que los límites de palabras con \b.

rel="\{[^{]*\bobjectid:(\d+) 

debería ser suficiente (entonces mirar el grupo de captura 1 para el valor del atributo.

1

¿Quieres recorrer todos los pares clave/valor? No es necesario de búsqueda hacia atrás para que :.

String s = 
    "<img rel=\"{objectid:498,newobject:1,fileid:338}\" " + 
    "width=\"80\" height=\"60\" align=\"left\" " + 
    "src=\"../../../../files/jpg1/Desert1.jpg\" alt=\"\" />"; 
Pattern p = Pattern.compile(
    "(?:\\brel=\"\\{|\\G,)(\\w+):(\\w+)"); 
Matcher m = p.matcher(s); 
while (m.find()) 
{ 
    System.out.printf("%s = %s%n", m.group(1), m.group(2)); 
} 

la primera vez find() se llama, la primera parte de la expresión coincide con rel="{ en llamadas posteriores, la segunda alternativa (\G,) toma el relevo para que coincida con una coma, pero sólo si se sigue inmediatamente la anterior MA tch. En cualquier caso, te deja alineado para (\w+):(\w+) para que coincida con el siguiente par clave/valor, y nunca puede coincidir en ningún lugar fuera del atributo rel.

Supongo que está aplicando la expresión regular a una etiqueta IMG aislada, tal como la publicó, no a todo un archivo HTML. Además, la expresión regular puede necesitar un pequeño ajuste para coincidir con sus datos reales. Por ejemplo, puede querer el más general ([^:]+):([^,}]+) en lugar de (\w+):(\w+).