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:
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.
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.