Quelques expressions régulières simples (1)

publicité
Daniel Tschirhart : Programmation Java V1.34
Quelques expressions
régulières simples (1)

Soit à rechercher dans un document le
mot elvis. Spécifier l’expression
suivante :
1. elvis
recherchera tous les mots contenant
elvis soit : elvis, elvise, pelvis, …
3
Daniel Tschirhart : Programmation Java V1.34
Quelques expressions
régulières simples (2)

L’expression précédente peut être
améliorée de façon suivante :
2. \belvis\b
\b est un méta caractère qui signifie
chercher le début ou la fin d’un mot.
En spécifiant cette expression on ne
cherchera que le mot elvis.
4
Daniel Tschirhart : Programmation Java V1.34
Quelques expressions
régulières simples (3)
Supposons rechercher sur la même ligne le mot
elvis suivi de tous les mots précédents le mot
concert.

Le « . » est un méta caractère signifiant n’importe quel
caractère excepté le caractère newline.

Le caractère « * » répète le nombre de fois nécessaire le
méta caractère ou le caractère précédent.

Ainsi « .* » signifie les tous caractères excepté newline.
L’expression suivante effectue la recherche désirée:
3. \belvis\b.*\bconcert\b

5
Daniel Tschirhart : Programmation Java V1.34
Déterminer la validité du format
d’un numéro de téléphone

Soit à rechercher sur une page Web les numéros
de téléphone ayant le format :
xxx-xxxxxxxxxx (exemple 033-0546314755).
L’expression suivante permet de spécifier ce
format:
4. \b\d\d\d-\d\d\d\d\d\d\d\d\d\d
\d signifie tout digit, - n’a pas de signification ici en tant
que méta caractère et signifie ce qu’il représente.

Il est possible d’éviter la répétition des caractères \d par
l’expression suivante :
5. \b\d{3}-\d{10}
6
Daniel Tschirhart : Programmation Java V1.34
Quelques méta caractères de
base
Nous connaissons déjà \b, \d, ., *.
Le caractère \s représente n’importe quel
séparateur (espace, tabulation, nouvelle ligne, …),
de même \w représente n’importe que caractère
alphanumérique.
Exemple :




\ba\w*\b
recherche tous les mots commençant par le lettre a
\d+
recherche tous les mots ne contenant que des chiffres
(+ est identique à * sauf qu’il nécessite au moins une
répétition).
\b\w{6}\b
trouve un mot de 6 lettres.
7
Daniel Tschirhart : Programmation Java V1.34
Syntaxe des motifs
d’expression régulière

La syntaxe des motifs est très riche.






1. Chaînes littérales
2. Méta caractères
3. Classes de caractères
4. Quantificateurs
5. Groupes de capture
6. Frontières de recherche
8
Daniel Tschirhart : Programmation Java V1.34
Liste des méta caractères
9
Daniel Tschirhart : Programmation Java V1.34
Méta caractères : exemples
[^x]
[aeiou]
[a-z,A-Z]
[^aeiou]
T ous
T ous
T ous
T ous
caractères
caractères
caractères
caractères
sau f x
aeio u
m a ju scu le s et m in u scu le s
sau f ae io u
10
Daniel Tschirhart : Programmation Java V1.34
Séquence d’échappement


Il y a un problème lorsque que l’on cherche un
caractère représentant un méta caractère comme
par exemple « ^ » ou « $ ».
Le caractère « \ » permet de supprimer la
sémantique du méta caractère. Ainsi :
« \^ », « \. », et « \\ », représentent les littéraux
« ^ », « . », et « \ ».
Dans une chaîne de caractère Java, le caractère
« \ » est considéré comme séquence
d’échappement. Ainsi :
“\b“ représente le caractère de contrôle bell et
“\\b“ le méta caractère \b
11
Daniel Tschirhart : Programmation Java V1.34
Répétitions
*
+
?
Répète un nombre de fois quelconque
Répète au moins une fois
Répète zéro ou une fois
Répète n fois
{n }
{n,m} Répète entre n et m fois
Répète au minimum n fois
{n,}
12
Daniel Tschirhart : Programmation Java V1.34
Frontières de recherche


Il est souvent intéressant de forcer l’emplacement des motifs recherchés : en
début de ligne, en fin de mot…
Les « spécificateurs de frontière » sont résumés dans le tableau suivant :
13
Daniel Tschirhart : Programmation Java V1.34
Classes de caractères
14
Daniel Tschirhart : Programmation Java V1.34
Règles de constructions des classes
de caractères personnalisées
15
Daniel Tschirhart : Programmation Java V1.34
Groupe capturant

Les parenthèses permettent de regrouper les
expressions. Exemple :


(\d{1,3}\.){3}\d{1,3}
L’expression précédente recherche 3 séquences de 1..3
digits terminés par un « . » suivi d’une autre expression de
1..3 digits. Exemple 192.168.0.1
L’expression précédente n’est cependant pas
complète puisqu’elle autorise des nombres
supérieurs à 255. L’expression suivante permet de
corriger ce défaut.

\b((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[04]\d|25[0-5]|[01]?\d\d?)\b
16
Daniel Tschirhart : Programmation Java V1.34
Quantificateurs
17
Annexe 1 - les REGEX sous Perl
Les regex Posix utilisée par exemple par Grep.
Les regex Perl en sont une variante. (Il existe aussi les posixextended qui y sont similaire)
Tout en restant des regex, ils offrent des possibilités différentes.
La principale différence est que ( et { sont les caractères réels
parenthèse et crochets en Posix, \( et \{ étant les caractères
spéciaux, alors qu'en Perl ou posix-extended ( et { sont des
caractères spéciaux, \( et \{ étant les caractères réels parenthèse et
crochets
Voyons-en les points les plus important, et donnons d'autres
exemples.
(pour l'examen, tout mélange de regex Perl Posix dans les réponse
est accepté tant qu'il n'est pas ambigü, c'est à dire qu'il n'a qu'une
seule interprétation possible ou que vous précisez s'il doit être
interprêté Perl ou Posix)
Téléchargement