summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid A. Madore <david+git@madore.org>2016-11-28 14:14:29 +0100
committerDavid A. Madore <david+git@madore.org>2016-11-28 14:14:29 +0100
commitd9a7d01f69c4408038bc5bde691a14c91beba93f (patch)
tree2d87c19d102572e2a87d68883016d9b79a559ef5
parent0f49e47629141621e91f797db14eec61b8bb3583 (diff)
downloadinf105-d9a7d01f69c4408038bc5bde691a14c91beba93f.zip
inf105-d9a7d01f69c4408038bc5bde691a14c91beba93f.tar.gz
inf105-d9a7d01f69c4408038bc5bde691a14c91beba93f.tar.bz2
More remarks about regexp syntax in the computer world.
-rw-r--r--notes-inf105.tex39
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}