Astuces webdesignAstuces et tutoriaux

Expressions régulières cours n°8

Publier le Mardi, juillet 14, 2009

<!– @page { margin: 2cm } –>

Alternance avec la barre verticale

Je vous ai déjà expliqué comment utiliser les classes de caractères pour matcher un seul caractère parmi plusieurs possibles. L’alternance est similaire. Vous pouvez utiliser l’alternance pour matcher une expression régulière parmi plusieurs possibles.

Si vous voulez rechercher le texte littéral chat ou chien, séparez les deux possibilités par une barre verticale. chat|chien, Si vous voulez plus de possibilités, vous pouvez allonger la liste. chat|chien|souris|poisson.

Le regex d’alternance est celui qui a la plus faible priorité des opérateurs de regex. C’est-à-dire qu’il demande au moteur de regex de matcher soit tout ce qui se trouve à gauche de la barre verticale, ou tout à droite de la barre verticale. Si vous voulez limiter la portée de l’alternance, vous devrez utiliser des parenthèses pour faire le regroupement. Si on veut améliorer le premier exemple pour matcher uniquement des mots entiers, on doit utiliser b(chat|chien)b. Le moteur de regex cherche une limite de mot, puis recherche soit “chat” soit “chien”, et ensuite une autre limite de mot. Si on avait omis les parenthèses, le moteur de regex aurait cherché “une limite de mot suivie de chat”, ou “chien suivit d’une limite de mot”.

N’oubliez pas que le moteur de regex est avide

J’ai déjà expliqué comment le moteur de regex est avide Il cesse de chercher dès qu’il trouve un matche valide. Par conséquent dans certaines situations, l’ordre des alternatives est important. Supposons que vous vouliez utiliser un regex pour matcher une liste de noms de fonctions dans un langage de programmation. Get, GetValue, Set ou SetValue.

Voyons le fonctionnement lorsque la chaîne est SetValue.Le regex commence au premier élément du regex, G, et au premier caractère de la chaîne, S. Il ne matche pas. Cependant le moteur de regex étudie l’expression régulière en entier avant de commencer. Donc il sait que l’expression régulière comprend des alternances, et que la regex n’a pas encore échoué. Donc il continue avec le second choix, qui est le second G dans le regex. A nouveau, cela ne matche pas. Le prochain élément est le premier S du regex. Le moteur matche, et il continue avec le prochain caractère de la chaîne, et l’élément suivent dans le regex. Le prochain élément du regex est le e après le S qui vient de matcher. E matche e. L’élément suivant, t matche t.

A cette étape, le troisième choix dans l’alternance matche. Comme le moteur regex est avide, il considère que l’alternance a matché dès qu’une option a matché. Dans cet exemple, il n’y a pas d’autres éléments dans le regex en dehors de l’alternance, donc le regex en entier a matché Set dans SetValue.

Au contraire de ce que l’on souhaitait, le regex ne matche pas la chaîne en entier. Il existe plusieurs solutions. Un choix peut être de tenir compte du fait que le moteur de regex est avide, et de changer l’ordre des options. Si n utilise GetValue|Get|SetValue|Set, SetValue sera tenté avant Set, et le moteur matchera la chaîne en entier. On peut aussi combiner les quatre choix pour en faire deux, en utilisant le point d’interrogation pour rendre une partie optionnelle. Get(Value)?|Set(Value)?. Comme le point d’interrogation est avide, SetValue sera testé avant Set.

La meilleure option est sans doute de noter que l’on veut seulement des mots complets. On ne veut pas matcher Set ou SetValue si le mot est SetValueFonction. Donc la solution est b(Get|GetValue|Set|SetValue)b ou b(Get(Value)?|Set(Value)?)b. Comme tous les choix se terminent pareil, on peut optimiser davantage avec b(Get|Set)(Value)?b.

Tous les styles de regex discuttés dans ce site sauf un fonctionnent ainsi : Le POSIX standard rend obligatoire que le matche le plus long soit retourné, quelque soit l’algorithme utilisé pour le moteur de regex.

VN:R_U [1.4.2_694]
Rating: 0.0/5 (0 votes cast)
  • Share/Save/Bookmark
Donner votre réponse
Vous devez être enregistré pour poster un commentaire.