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)