Les sous-masques sont délimités par des parenthèses, et peuvent être imbriqués. Ajouter des sous-masques a deux utilités :
1. Délimiter des alternatives. Par exemple, le masque char(don|mant|) acceptera les mots "char", "charmant", ou "charmant". Sans les parenthèses, il n'accepterait que "chardon", "mant" ou la chaîne vide "".
2. Le sous-masque est considéré comme capturant : lorsqu'une chaîne sujet est acceptée par le masque complet, les sous-masques sont transmis à l'appelant grâce à un vecteur de sous-masques. Les parenthèses ouvrantes sont comptées de gauche à droite, (commençant à 1).
Par exemple, soit la chaîne sujet "le roi soleil" qui est utilisée avec le masque suivant : Le ((roi|prince) (soleil|charmant)), les sous-masques capturés sont "roi soleil", "roi", et "soleil", numérotés respectivement 1, 2, et 3.
L'ubiquité des parenthèses n'est pas toujours simple d'emploi. Il y a des moments où regrouper des sous-masques est nécessaire, sans pour autant capturer la valeur trouvée. Si une parenthèse ouvrante est suivie de "?:", le sous-masque ne capture pas la chaîne assortie, et ne sera pas compté lors de la numérotation des captures. Par exemple, avec la chaîne "le prince charmant", utilisé avec le masque Le (( ?roi|prince) (soleil|charmant)) les chaînes capturées seront "prince charmant" et "charmant", numérotés respectivement 1 et 2. Le nombre maximal de chaînes capturées est de 99, et le nombre total de sous-masques (capturant ou non) ne doit pas dépasser 200.
En guise de raccourci, si n'importe quelle option de configuration est requise au début des sous-masques non-capturants, les lettres d'option peuvent apparaître entre le signe "?" et le signe ":". Ainsi, les 2 masques
(?i:samedi|dimanche) (?:(?i)samedi|dimanche)
captureront exactement les mêmes chaînes. Du fait que les branches alternatives sont testées de la gauche vers la droite, et que les options ne sont pas réinitialisées tant que le sous masque n'est pas atteint, une option de configuration d'une branche n'affecte pas les branches sous-jacentes ; ainsi, les 2 masques ci-dessus captureront "SAMEDI", mais aussi "Samedi".
Il est possible de nommer le sous-masque avec (?P<name>pattern) depuis PHP 4.3.3. Les tableaux avec les masques doivent contenir le masque indexé par la chaîne à côté le masque indexé par le numéro.