Les sous-masques sont délimités par des parenthèses, et peuvent être imbriqués. Ajouter des sous-masques a deux utilités :
     Localiser un ensemble d'alternatives. Par exemple, le motif
     cat(aract|erpillar|) trouve un des mots "cat",
     "cataract", ou "caterpillar". Sans les parenthèses, cela trouverait
     "cataract", "erpillar" ou la chaine vide.
    
Cela configure le sous-masque comme capturant. Lorsque tout le motif correspond, la portion de la sous-chaine qui correspond au sous-masque est passé à l'appelant grâce à l'argument ovector de pcre_exec(). Les parenthèses ouvrantes sont comptées depuis la gauche vers la droite (commençant à 1) jusqu'à obtenir le nombre des sous-masques capturants.
   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 65535. Il se peut qu'il
   soit impossible de compiler un masque aussi large, toutefois, ceci dépend des
   options de configuration de libpcre.
  
   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 un sous-masque en utilisant la syntaxe
   (?P<name>pattern). Ce sous-masque sera alors
   indexé dans le tableau de concordance par sa position, ainsi 
   que par son nom. Il y a deux syntaxes alternatives :
   (?<name>pattern) et
   (?'name'pattern).
  
   Quelques fois, il est nécessaire d'avoir plusieurs correspondances en alternant
   les sous groupes dans une expression régulière. Normalement, chacun recevra son
   propre nombre de références arrière même si seulement un d'entre eux ne peut
   correspondre. Pour éviter cela, la syntaxe (?| permet d'autoriser
   les nombres dupliqués. Soit l'expression ci-après utilisée avec la chaine
   Sunday:
  
(?:(Sat)ur|(Sun))day
   Ici Sunest stocké dans la référence arrière 2, alors que la référence
   arrière 1 est vide. La correspondance mène donc à Sat dans la référence
   arrière 1 alors que la référence arrière 2 n'existe pas. Changer le masque en utilisant
   (?| résoud ce problème:
  
(?|(Sat)ur|(Sun))day
   Avec ce masque, à la fois Sun et Sat
   seront stockés dans la référence arrière 1.