Astuces webdesignAstuces et tutoriaux

Expressions régulières Cours n°7

Publier le Lundi, juillet 13, 2009

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

Limite des mots

Le métacaractère b est une ancre tout comme le puissance et le dollard. Il matche une position appelée la “limite du mot”. Ce match a une taille zéro.

Il existe trois positions considérées comme des limites de mots :

  • Avant le premier caractère dans la chaîne, si le premier caractère est un signe alphanumérique.

  • Après le dernier caractère dans la chaîne, si le dernier caractère est alphanumérique.

  • Entre deux caractères dans la chaîne, si l’un est alphanumérique et que l’autre ne l’est pas.

Pour résumer : b permet d’effectuer une recherche “mots complets uniquement” en utilisant une expression régulière de la forme bmotb.A “word character” is a character that can be used to form words. All characters that are not “word characters” are “non-word characters”.

Dans tous les styles, les caractères [a-zA-Z0-9_] sont considérés comme alphanumériques. Ils sont matchés par le raccourci de classe de caractères w. Les styles qui utilisent ASCII comme limite d emots ne reconnaît que ceux-là comme signes alphanumériques. Les styles indiquant “YES” reconnaissent les lettres et les chiffres d’autres langues ou même tout l’Unicode comme alphanumérique. Notez que Java supporte Unicode pour b mais pas pour w. Le Python propose des drapeaux pour contrôler quels caractères sont des alphanumériques (à la fois pour b et pour w).

En Perl et pour les styles de regex discuttés dans ce tutoriel, il n’existe qu’un métacaractère qui matche à la fois avant et après un mot. C’est parce qu’une position donnée ne peut pas être en même temps au début et à la fin d’un mot. L’utilisation d’un seul opérateur rend les choses plus faciles pour vous.

Comme les chiffres sont considérés comme des alphanumériques, b4b peut matcher un 4 qui ne fait pas partie d’un nombre plus grand. Ce regex ne matchera pas 44 feuilles de a4. Donc “b matche avant et après une séquence alphanumérique” est plus juste que de dire “avant et après chaque mot”.

Les limites de mots négativées

B est la version négativée de b. B matche sur toutes les positions où b ne matche pas. En pratique, B matche sur toute position entre deux caractères de mots, de même que pour toute position entre deux caractères non alphanumériques.

Un regard sur le moteur de regex

Voyons ce que arrive lorsque l’on applique le regex bîleb à la chaîne Cette île est belle. Le moteur commence avec le premier élément b sur le premier caractère C. Comme cet élément a une taille zéro, la position avant le caractère est inspectée. b matche ici, parce que le C est un alphanumérique et le caractère avant lui est le vide avant le début de la chaîne. Le moteur continue avec l’élément suivant : Le e littéral. Comme l’élément précédent avait une taille zéro, le moteur de regex n’avance pas au caractère suivant dans la chaîne. I ne matche pas C, donc le moteur retente le premier élément sur la prochaine position de caractère.

b ne matche pas entre le C et le e. Il ne matche pas non plus entre e et t, ni entre t et t, ni même entre t et e.

Le prochain caractère dans la chaîne est un espace. b matche ici parce que l’espacement n’est pas un caractère alphanumérique, et que le caractère précédent en est un. De nouveau le moteur poursuit avec le i qui ne matche pas l’espacement.

Il avance d’un caractère et repart sur le premier élément regex ; b matche entre l’espacement et le î de la chaîne. Le regex continue, et trouve que le î matche le î, le l matche l et le e matche e. Le dernier élément du regex est b, qui matche également à la position avant le second espacement car l’espacement n’est pas un alphanumérique et le caractère avant lui en est un. This fails because this position is between two word characters. Again, the b fails to match and continues to do so until the second space is reached. It matches there, but matching the i fails.

But b matches at the position before the third i in the string. The engine continues, and finds that i matches i and s matches s. The last token in the regex, b, also matches at the position before the third space in the string because the space is not a word character, and the character before it is.

The engine has successfully matched the word is in our string, skipping the two earlier occurrences of the characters i and s. If we had used the regular expression is, it would have matched the is in This.

Limite des mots Tcl

Les limites des mots, tels que décrits ci-dessus, sont supportées par tous les styles de regex décrits sur ce site web, à l’exception des deux style POSIX RE et des commandes regex Tcl. POSIX ne supporte pas du tout les limites de mots. Tcl utilise une syntaxe différente.

En Tcl, b matche un caractère de backspace, tout comme x08 dans la plupart des styles de regex (y compris Tcl). B matche un backslash simple en Tcl, tout comme \ dans tous les autres styles regex (incluant Tcl).

Tcl utilise la lettre “y” au lieu de la lettre “b” pour matcher les limites de mots. y matche toute position de limite de mot, tandis que Y matche toute position qui n’est pas une limite de mot. Ces éléments de regex Tcl matchent exactement comme b et B dans les styles de regex Perl. Ils ne distinguent pas entre le début et la fin d’un mot.

Tcl a deux autres éléments de limite de mots qui distinguent entre le début et la fin d’un mot. m matche uniquement le début d’un mot. C’est-à-dire qu’il matche toute position avec un caractère non alphanumérique à sa gauche, et un caractère alphanumérique à sa droite. Il matche également le début de la chaîne, si le premier caractère est un signe alphanumérique. M matche uniquement la fin d’un mot. C’est-à-dire qu’il matche toute position avec un caractère alphanumérique à sa gauche, et un caractère non alphanumérique à sa droite. Il matche également à la fin de la chaîne si le dernier caractère de la chaîne est un caractère alphanumérique.

Le seul moteur regex qui supporte le style Tcl de limites de mots (à part Tcl bien sûr) est le moteur Jgsoft. Dans PowerGREP et EditPad Pro, b et B sont des limites de mots style Perl, et y, Y, m et M sont deslimites de mots style Tcl.

Dans la plupart des cas, l’absence d’éléments m et M n’est pas un problème. ywordy ou mwordM trouvent une occurence “mots complets uniquement”. Mwordm ne matche nulle part, puisque M ne matche jamais sur une position suivie par un caractère alphanumérique, et m jamais à une position précédée par ce genre de caractères. Si votre expression régulière a besoin de matcher des caractères avant ou après y, vous pouvez facilement spécifier dans le regex si ces caractères doivent être alphanumériques ou non. Par ex. Si vous voulez matcher tout mot, yw+y donnera le même résultat que m.+M.L’utilisation de w à la place du point force automatiquement le premier y au début d’un mot, et le second y à la fin d’un mot. Notez que y.+y ne fonctionne pas. Ce regex matche chaque mot, et aussi chaque séquence non alphanumérique entre les mots dans la chaîne visée. Cela dit, si votre style supporte m et M, le moteur de regex peut faire tourner mw+M légèrement plus rapidement que yw+y, suivant l’optimisation interne.

Si votre style de regex supporte lookahead et lookbehind, vous pouvez utiliser (?<!w)(?=w) pour émuler le m de Tcl et (?<=w)(?!w) pour émuler M. Bien que plus verbeux, ces constructions matchent exactement pareil que les limites de mots de Tcl.

Si votre style a un lookahead mais pas de lookbehind, et qu’il a aussi des limites de mots style Perl, vous pouvez utiliser b(?=w) pour émuler le Tcl m, et b(?!w) pour émuler M. b matche au début ou à la fin d’un mot, et le lookahead vérifie si le caractère suivant fait partie d’un mot ou pas. Si c’est le cas, on est au début d’un mot. Sinon, on est à la fin d’un mot.

Limite des mots GNU

L’extention GNU aux expressions régulières POSIX rajoute un support pour les limites b et B, comme décrites plus haut. GNU utilise également sa propre syntaxe pour les limites de début de mot et de fin de mot. < matche le début d’un mot, comme le Tcl m. > matche la fin d’un mot, comme le Tcl M.

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.