2011-02-10 16 views
5

Bien, entonces estoy trabajando en un proyecto en el que necesito una expresión regular que puede coincidir con un * seguido de 1-4 espacios o pestañas y luego seguido de una fila de texto. En este momento estoy usando. * Después del lookbehind para fines de prueba. Sin embargo, puedo hacer que coincida explícitamente con 1, 2 o 4 espacios/pestañas, pero no con 1-4. Estoy probando contra el bloque siguienteEl rango del cuantificador no funciona en lookbehind

* test line here 
* Second test 
* Third test 
* Another test 

y estos son los dos patrones que estoy probando (?<=(\*[ \t]{3})).* Su funcionamiento es como se esperaba y coincide con la segunda línea, lo mismo si reemplazo 3 con 1, 2 o 4 sin embargo, si Lo reemplazo con 1,4 formando el siguiente patrón (?<=(\*[ \t]{1,4})).* ya no coincide con ninguna de las filas y sinceramente no puedo entender por qué. Intenté buscar en Google sin éxito. Estoy usando la bandera g (lobal).

Respuesta

5

PHP, al igual que muchos sabores, no es compatible con longitud variable lookbehind. El único soporte es alternancia (|) en el nivel superior del visualizador detrás. Incluso un ? puede romper el patrón. Una alternativa es utilizar:

(?<=\*[ \t]|\*[ \t]{2}|\*[ \t]{3}|\*[ \t]{4}).* 

O mejor, abortar la búsqueda hacia atrás para un grupo:

\*[ \t]{1,4}(.*) 

Esto debería funcionar bien para usted, ya que no parece como que tiene la superposición de sus partidos de todas formas.

Del manual:

El contenido de una aserción hacia atrás están restringidas de tal manera que todas las cadenas de que coincide deben tener una longitud fija. Sin embargo, si hay varias alternativas, no todas tienen que tener la misma longitud fija. Por lo tanto, (? < = bullock | donkey) está permitido, pero (? <! Dogs? | Cats?) Provoca un error en tiempo de compilación. Las ramas que coinciden con diferentes cadenas de longitud solo se permiten en el nivel superior de una afirmación de referencia.

Fuente: http://www.php.net/manual/en/regexp.reference.assertions.php

+1

También podría valer la pena mencionar que la expresión regular sigue sin hacer lo que el PO probablemente quiere - que coincide con gusto más de 4 espacios porque '*' coincidirá con espacios muy bien.. –

+1

@Tim: ese es un buen punto, pero creo que '. *' Es solo un ejemplo simplificado de lo que OP ve como un comportamiento extraño: lo interesante es el aspecto detrás. – Kobi

+0

Gracias, lo pasé por alto. Por cierto, RegexBuddy no se queja de '{1,4}' (se opone a cuantificadores infinitos, pero no a este cuantificador finito). –

Cuestiones relacionadas