Alternative et regroupement
Mise à jour : novembre 2007
L'alternative utilise le caractère | pour opérer un choix entre deux ou plusieurs possibilités. Vous pouvez par exemple étendre l'expression régulière de titre de chapitre pour retourner un résultat qui représente plus que des titres de chapitre. Toutefois, ce n'est pas aussi évident que vous pourriez le penser. L'alternative correspond à la plus grande expression possible de chaque côté du caractère |.
Exemple
Vous pourriez penser que l'expression suivante correspond soit à Chapter ou Section suivi de un ou deux chiffres au début et à la fin d'une ligne :
/^Chapter|Section [1-9][0-9]{0,1}$/
Malheureusement, l'expression régulière ci-dessus correspond soit au mot Chapter au début d'une ligne ou au mot Section suivi d'un nombre quelconque à la fin de la ligne. Si la chaîne d'entrée est Chapter 22, l'expression ci-dessus ne correspond qu'au mot Chapter. Si la chaîne d'entrée est Section 22, l'expression correspond à Section 22.
Pour que l'expression régulière donne un meilleur résultat, vous pouvez utiliser des parenthèses afin de limiter la portée de l'alternative. De cette façon, vous êtes assuré qu'elle ne s'applique qu'aux deux mots Chapter et Section. Sachez toutefois que les parenthèses sont également utilisées pour créer des sous-expressions et éventuellement les capturer pour une utilisation ultérieure (ce point est abordé dans la rubrique relative aux backreferences. En ajoutant des parenthèses aux endroits appropriés de l'expression régulière ci-dessus, vous pouvez faire en sorte qu'elle corresponde à Chapter 1 ou Section 3.
L'expression régulière suivante utilise des parenthèses pour regrouper Chapter et Section afin de donner le résultat escompté :
/^(Chapter|Section) [1-9][0-9]{0,1}$/
Bien que ces expressions fonctionnent correctement, les parenthèses autour de Chapter|Section entraînent également la capture d'un des deux mots correspondants pour une utilisation ultérieure. Dans la mesure où il n'existe qu'une seule paire de parenthèses dans l'expression ci-dessus, il n'y a qu'une seule sous-correspondance capturée. Il est possible de faire référence à cette sous-correspondance en utilisant les propriétés $1-$9 de l'objet RegExp.
Dans l'exemple ci-dessus, vous souhaitez simplement utiliser les parenthèses pour regrouper un choix entre les mots Chapter et Section. Pour éviter que la correspondance ne soit enregistrée pour une éventuelle utilisation ultérieure, placez ?: avant le modèle d'expression régulière figurant entre les parenthèses. La modification suivante donne le même résultat sans enregistrer la sous-correspondance :
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
Outre les métacaractères ?:, il existe deux autres métacaractères qui n'effectuent pas de capture et créent des correspondances de recherche avancée. Une recherche avancée positive, définie à l'aide de ?=, établit une correspondance de la chaîne de recherche à tout endroit marquant le début d'un modèle d'expression régulière entre parenthèses correspondant. Une recherche avancée négative, définie à l'aide de ?!, établit une correspondance de la chaîne de recherche à tout endroit marquant le début d'une chaîne ne correspondant pas au modèle d'expression régulière.
Supposons, par exemple que vous ayez un document comprenant des références à Windows 3.1, Windows 95, Windows 98 et Windows NT. Supposons encore que vous devez mettre à jour le document en remplaçant toutes les références à Windows 95, Windows 98 et Windows NT par des références à Windows 2000. L'expression régulière suivante, qui est un exemple de recherche avancée positive, correspond à Windows 95, Windows 98 et Windows NT :
/Windows(?=95 |98 |NT )/
Dès qu'une correspondance est trouvée, la recherche de la correspondance suivante commence immédiatement après le texte trouvé sans inclure les caractères de la recherche avancée. Par exemple, si l'expression ci-dessus correspondait à Windows 98, la recherche reprend après Windows et non après 98.