Sub-patrones

Los sub-patrones están delimitados por paréntesis, los cuales pueden estar anidados. Marcar parte de un patrón como un sub-patrón hace dos cosas:

  1. Localiza un conjunto de alternativas. Por ejemplo, el patrón cata(rata|pulta|) coincide con una de las palabras "cata", "catarata", o "catapulta". Sin los paréntesis, coincidiría con "catarata", "pulta" o la cadena vacía.

  2. Establece el sub-patrón como un sub-patrón de captura (como se definió antes). Cuando el patrón completo coincide, esa porción de la cadena objetivo que coincidió con el sub-patrón es devuelta la llamador mediante el argumento ovector de pcre_exec(). Los paréntesis de apertura se cuentan de izquierda a derecha (comenzando por 1) para obtener el número de los sub-patrones de captura.

Por ejemplo, si la cadena "el rojo amanecer" se compara con el patrón el ((rojo|oscuro) (amanecer|atarceder)) las cadenas capturadas son "rojo amanecer", "rojo", y "amanecer", y son numeradas como 1, 2, y 3.

El hecho de que los simples paréntesis lleven a cabo dos funciones no es siempre útil. Con frecuencia se presenta el caso en el que un sub-patrón de agrupamiento se requiere sin la necesidad de una captura. Si un paréntesis de apertura es seguido por "?:", el sub-patrón no realiza ninguna captura, y no es contado cuando se computa el número de cualquier sub-patrón de captura subsiguiente. Por ejemplo, si la cadena "el oscuro atardecer" se compara con el patrón the ((?:rojo|oscuro) (amanecer|atarceder)) las subcadenas capturadas son "oscuro atardecer" y "atarceder", y son numeradas como 1 y 2. El número máximo de subcadenas capturadas es de 65535. Sin embargo, podría no ser posible compilar patrones tan grandes, dependiendo de las opciones de configuración de libpcre.

Como abreviación conveniente, si se necesita cualquier establecimiento de opciones al inicio de un sub-patrón que no sea de captura, las letras de opciones pueden aparecen entre el "?" y ":". Así lo dos patrones

(?i(?i:lunes|martes)
(?:(?i)lunes|martes)

coinciden exactamente con el mismo conjunto de cadenas. Dado que las ramas alternativas son probadas de izquierda a derecha, y las opciones no se reinician hasta que se alcance el final del sub-patrón, el establecimiento de una opción en una rama afecta a las ramas siguientes, por lo que los patrones de arriba coinciden tanto con "MARTES" como con "Lunes".

Es posible nombrar un sub-patrón usando la sintaxis (?P<nombre>patrón). Este sub-patrón será entonces indexado en el array de coincidencias mediante su posición numérica normal y mediante su nombre también. PHP 5.2.2 introdujo dos sintaxis alternativas (?<nombre>patrón) y (?'nombre'patrón).

A veces es necesario tener múltiples coincidencias, pero alternando subgrupos en una expresión regular. Normalmente, a cada subgrupo se le asignaría su propio número de retroreferencia incluso si sólo uno de ellos coincidiera. Para superar esto, la sintaxis (?| permite tener números duplicados. Considere la siguiente expresión regular comparada con la cadena Sunday:

(?:(Sat)ur|(Sun))day

Aquí Sun se guarda en la retroreferencia 2, mientras que la retroreferencia 1 está vacía. La comparación cede Sat a la retroreferncia 1 mientras que la retroreferncia 2 no existe. Cambiar el patrón para usar (?| corrige este problema:

(?|(Sat)ur|(Sun))day

Al usar este patrón, tanto Sun como Sat serían almacenados en la retroreferencia 1.

add a note add a note

User Contributed Notes 1 note

up
2
mike at eastghost dot com
2 years ago
(?:(?!string).)

?: makes a subpattern

?! is a negative look-ahead.

Putting negative look-ahead before the dot causes regex engine to first find any occurrence of the negative look-ahead string, and only then, if the negative look-ahead string is not present, should an arbitrary character (due to the dot) match.
To Top