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 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 retro-referencia 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 retro-referencia 2, mientras que la retro-referencia 1 está vacía. La comparación cede Sat a la retro-referncia 1 mientras que la retro-referncia 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 retro-referencia 1.