PHP 8.5.0 Beta 2 available for testing

Subpatrones

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:

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

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

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top