2012-06-06 29 views
9

Estoy tratando de entender un fragmento de código y encontré esta expresión regular utilizada en la función preg_replace de PHP.¿Qué significa la expresión regular (? <! -)

'/(?<!-)color[^{:]*:[^{#]*$/i' 

Este bit ... (?<!-) duerma aparece en ninguno de mis manuales reg-exp. Alguien sabe lo que esto significa, por favor? (Google no devuelve nada - No creo que los símbolos funcionen en google.)

+6

Es un smiley del enemigo de Batman golpe en el ojo izquierdo, pero la sonrisa de todos modos ... (pero coincidirá con cualquier persona que lleva un sombrero similar) –

+0

Como referencia: [mirar a los lados aserciones] (http: // perldoc .perl.org/perlre.html # Look-Around-Assertions) de perlre, [LookRehind positivo y negativo] (http://www.regular-expressions.info/lookaround.html#lookbehind) en regular-expressions.info. – outis

Respuesta

10

El ?<! al comienzo de un grupo entre paréntesis es un negative lookbehind. Afirma que la palabra color (estrictamente, c en el motor) no fue precedida por un carácter -.

Así, para un ejemplo más concreto, coincidiría con color en las cuerdas:

color 
+color 
someTextColor 

Pero va a fallar en algo así como -color o background-color. También tenga en cuenta que el motor técnicamente no "coincidirá" con lo que precede al c, simplemente afirma que no es un guión. Esta puede ser una distinción importante según el contexto (illustrated on Rubular with a trivial example; tenga en cuenta que solo el b en la última cadena coincide, no la letra anterior).

6

PHP utiliza expresiones regulares compatibles con Perl (PCRE) para las funciones preg_ *. De perldoc perlre:

"(?<!pattern)"
una anchura cero negativo de observación detrás de la afirmación. Por ejemplo
"/(?<!bar)foo/" coincide con cualquier aparición de "foo" que hace
no sigue "bar". Funciona solo para la apariencia de ancho fijo:
detrás.

+0

¿Por qué no cita el [PCRE] (http://pcre.org/pcre.txt)? – Gumbo

+0

@Gumbo - Eso hubiera sido mejor. Cité el perldoc porque sabía exactamente dónde encontrar la información. – jordanm

4

¡Estoy aprendiendo expresiones regulares usando el módulo re de Python!

http://docs.python.org/library/re.html

Partidos si la posición actual en la cadena no está precedido por un partido para .... Esto se llama una aserción hacia atrás negativo. De forma similar a las aserciones de búsqueda positiva positiva, el patrón contenido solo debe coincidir con cadenas de cierta longitud fija. Los patrones que comienzan con aserciones de observación negativa pueden coincidir al principio de la cadena que se busca.

+1

Python regex no es PCRE como PHP. – jordanm

+0

Comprensible, solo pensé en señalar otra biblioteca de expresiones regulares, soy nuevo en las expresiones regulares, así que estoy tratando de aprender todo lo que puedo sobre las expresiones regulares en la mayoría de los idiomas principales, así que pensé que señalaría Python's. – richardhsu

Cuestiones relacionadas