Les sous-masques conditionnels
Il est possible de lier un sous-masque à une condition, ou de
choisir entre deux sous-masques alternatifs, en fonction du
résultat d'une assertion, ou suivant les résultats
de recherche précédents.
Les deux formes possibles de sous-masques conditionnels sont
Si les conditions sont satisfaites, le masque positif est utilisé,
sinon, le masque négatif est utilisé, si présent.
S'il y a plus de deux possibilités, une erreur est générée
à la compilation.
Il y a deux types de conditions : si le texte entre les parenthèses
est une séquence de chiffres, alors la condition est satisfaite si
le sous-masque correspondant à ce numéro a réussi.
Considérons le masque suivant, qui contient des espaces non
significatifs pour le rendre plus compréhensible (on supposera
l'option PCRE_EXTENDED
activée) et qui est divisée en trois parties
pour simplifier les explications :
La première partie recherche une parenthèse ouvrante
optionnelle et, si elle existe, elle est capturée. La deuxième
partie recherche une séquence de caractères qui ne contiennent
pas de parenthèses. La troisième partie est
conditionnée à la première, et s'assure que s'il
y a une parenthèse ouvrante, il en existe une fermante.
Si une parenthèse ouvrante a été trouvée,
elle a été capturée, et donc la première capture
existe, et la condition est exécutée. Sinon, elle est
ignorée. Ce masque recherche donc une séquence de lettres,
éventuellement placées entre parenthèse.
Si la condition est la chaîne (R)
, elle sera
satisfaite si un appel récursif au masque ou au sous-masque
a été fait. Au premier appel, la condition n'est pas vérifiée.
Si la condition n'est pas une séquence de chiffres, il faut que ce soit
une assertion. Ce peut être une assertion positive ou négative,
arrière ou avant. Considérons le masque suivant (mêmes conditions que
le précédent) et avec deux possibilités en seconde ligne :
La condition est une assertion avant positive, qui recherche une
séquence optionnelle de caractères non-lettre. En d'autres
termes, elle teste la présence d'au moins une lettre dans la chaîne
sujet. Si une lettre est trouvée, la recherche se poursuit avec
la première alternative, et sinon, avec la seconde. Ce masque
recherche des chaînes de la forme dd-aaa-dd
ou
dd-dd-dd
, avec "aaa
" qui sont des
lettres, et dd
qui sont des chiffres.