From d9a7d01f69c4408038bc5bde691a14c91beba93f Mon Sep 17 00:00:00 2001 From: "David A. Madore" Date: Mon, 28 Nov 2016 14:14:29 +0100 Subject: More remarks about regexp syntax in the computer world. --- notes-inf105.tex | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) 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} -- cgit v1.2.3