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, Sun
est stocké dans la référence arrière 2, alors que la référence
arrière 1 est vide. La recherche de correspondance de Saturday
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.