diff options
author | David A. Madore <david+git@madore.org> | 2016-11-28 14:14:29 +0100 |
---|---|---|
committer | David A. Madore <david+git@madore.org> | 2016-11-28 14:14:29 +0100 |
commit | d9a7d01f69c4408038bc5bde691a14c91beba93f (patch) | |
tree | 2d87c19d102572e2a87d68883016d9b79a559ef5 | |
parent | 0f49e47629141621e91f797db14eec61b8bb3583 (diff) | |
download | inf105-d9a7d01f69c4408038bc5bde691a14c91beba93f.tar.gz inf105-d9a7d01f69c4408038bc5bde691a14c91beba93f.tar.bz2 inf105-d9a7d01f69c4408038bc5bde691a14c91beba93f.zip |
More remarks about regexp syntax in the computer world.
-rw-r--r-- | notes-inf105.tex | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/notes-inf105.tex b/notes-inf105.tex index 1aad5d4..6d60fe7 100644 --- a/notes-inf105.tex +++ b/notes-inf105.tex @@ -767,6 +767,12 @@ dans l'ordre ASCII/Unicode, ou bien des négations d'intervalles comme \texttt{[\char"5Ea-z]} qui désigne un caractère qui \emph{n'est pas} entre \texttt{a} et \texttt{z}). +Toutes sortes d'autres racourcis ou commodités de notation peuvent +exister, par exemple \texttt{\char"5C<} et \texttt{\char"5C>} pour +désigner un début et une fin de mot (la définition précise de « mot » +pouvant varier), ou encore \texttt{$r$\{$n_1$,$n_2$\}} qui cherche +entre $n_1$ et $n_2$ répétitions de $r$. + \thingy Une autre subtilité est que la plupart des moteurs d'expressions régulières en informatique vont, par défaut, \emph{rechercher un facteur} (appelé « sous-chaîne » en informatique) @@ -786,10 +792,41 @@ façon générale, trouver si une chaîne vérifie une expression rationnelle $r$, revient à y chercher \texttt{\char"5E\relax $r$\char"24}). +\thingy Comme les expressions régulières en informatique sont +représentées par des chaînes de caractères qui appartiennent au même +alphabet (ASCII ou Unicode) que les chaînes sur lesquelles on effectue +la recherche, le problème se pose de distinguer les métacaractères +(l'étoile de Kleene \texttt{*}, par exemple) des caractères eux-mêmes +(comment rechercher les chaînes contenant le caractère \texttt{*} si +\texttt{*} est utilisé par l'étoile de Kleene ?). La solution est +d'introduire un mécanisme d'\emph{échappement} : ainsi, +\texttt{x\char"5C*} recherche un \texttt{x} suivi d'un +astérisque \texttt{*}, tandis que \texttt{x*} recherche un nombre +quelconque de répétitions de la lettre \texttt{x}. + \thingy Il existe malheureusement de nombreuses différences, parfois très subtiles, entre moteurs, ne serait-ce que dans les notations : un moteur pourra par exemple noter \texttt{(?)} ce qu'un autre note -\texttt{\char"5C(\char"5C?\char"5C)} et vice versa. +\texttt{\char"5C(\char"5C?\char"5C)} et vice versa. La seule solution +est de consulter attentivement la documentation de chaque moteur +d'expressions régulières pour connaître la syntaxe utilisée. + +Signalons tout de même qu'il existe deux principales familles de +syntaxes d'expressions régulières en informatique : les expressions +régulières « POSIX étendues », utilisée notamment par le programme +Unix \texttt{egrep}, et les expressions régulières Perl, qui ont été +réadaptées dans beaucoup de langages, notamment Java, JavaScript, +Python et d'autres. + +\thingy Signalons comme complication supplémentaire que dans de +nombreux langages, les expressions régulières sont saisies comme des +chaînes de caractères plutôt que d'avoir une syntaxe spéciale, et ceci +a pour effet d'introduire un niveau supplémentaire d'échappement : par +exemple, en Java, pour rechercher si une chaîne de caractères $s$ +contient un astérisque, on utilisera +\texttt{$s$.matches("\char"5C\char"5C*")} puisque l'expression +régulière à utiliser est \texttt{\char"5C*} et que cette chaîne de +caractères s'écrit \texttt{"\char"5C\char"5C*"} en Java. \section{Automates finis} |