Los subpatrones están delimitados por paréntesis (paréntesis redondos), que pueden anidarse. Marcar una parte de un patrón como subpatrón hace dos cosas:
Localiza un conjunto de alternativas. Por ejemplo, el patrón
cat(aract|erpillar|)
coincide con una de las palabras "cat",
"cataract", o "caterpillar". Sin los paréntesis, coincidiría
con "cataract", "erpillar" o la cadena vacía.
Establece el subpatrón como un subpatrón de captura (como se definió anteriormente). Cuando todo el patrón coincide, la porción de la cadena de sujeto que coincidió con el subpatrón se devuelve al llamador a través del argumento ovector de pcre_exec(). Los paréntesis de apertura se cuentan de izquierda a derecha (comenzando desde 1) para obtener los números de los subpatrones de captura.
Por ejemplo, si la cadena "the red king" se compara con
el patrón
the ((red|white) (king|queen))
las subcadenas capturadas son "red king", "red", y "king",
y están numeradas 1, 2, y 3.
El hecho de que los paréntesis simples cumplan dos funciones no
siempre es útil. Hay momentos en los que se requiere un subpatrón de agrupación
sin un requisito de captura. Si un paréntesis de apertura es seguido por "?:", el subpatrón no
realiza ninguna captura, y no se cuenta al calcular el número de cualquier subpatrón de captura posterior. Por ejemplo, si la cadena "the white queen" se compara con
el patrón
the ((?:red|white) (king|queen))
las subcadenas capturadas son "white queen" y "queen", y
están numeradas 1 y 2. El número máximo de subcadenas capturadas
es 65535. Puede que no sea posible compilar patrones tan grandes,
sin embargo, dependiendo de las opciones de configuración de libpcre.
Como abreviatura conveniente, si se requieren configuraciones de opciones al inicio de un subpatrón no de captura, las letras de opciones pueden aparecer entre el "?" y el ":". Por lo tanto, los dos patrones
(?i:saturday|sunday) (?:(?i)saturday|sunday)
coinciden exactamente con el mismo conjunto de cadenas. Debido a que las ramas alternativas se prueban de izquierda a derecha, y las opciones no se restablecen hasta que se alcanza el final del subpatrón, una configuración de opción en una rama afecta a las ramas posteriores, por lo que los patrones anteriores coinciden con "SUNDAY" así como con "Saturday".
Es posible nombrar un subpatrón usando la sintaxis
(?P<name>pattern)
. Este subpatrón luego
será indexado en el array de coincidencias por su posición numérica normal y
también por nombre. Hay dos sintaxis alternativas
(?<name>pattern)
y (?'name'pattern)
.
A veces es necesario tener múltiples coincidencias alternativas
en una expresión regular. Normalmente, cada una de estas tendría
su propio número de referencia inversa, aunque solo una de ellas podría coincidir.
Para superar esto, la sintaxis (?|
permite tener números duplicados. Considere el siguiente regex aplicado a la cadena Sunday
:
(?:(Sat)ur|(Sun))day
Aquí Sun
se almacena en la referencia inversa 2, mientras que
la referencia inversa 1 está vacía. Hacer coincidir Saturday
produce
Sat
en la referencia inversa 1 mientras que la referencia inversa 2 no existe. Cambiar el patrón para usar (?|
resuelve este problema:
(?|(Sat)ur|(Sun))day
Usando este patrón, tanto Sun
como Sat
se almacenarían en la referencia inversa 1.