Sintaxis de expresiones regulares de PCRE
PHP Manual

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 sub-cadenas capturadas son "oscuro atardecer" y "atarceder", y son numeradas como 1 y 2. El número máximo de sub-cadenas capturadas es de 99, y el número máximo de todos los sub-patrones, tanto de captura como de no-captura, es de 200.

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.


Sintaxis de expresiones regulares de PCRE
PHP Manual