Vous êtes sur la page 1sur 36

Expressions rgulires en Java avec lAPI Regex

Hugo Etivant

Dernire mise jour : 05 aot 2004

Hugo Etivant

http://cyberzoide.developpez.com

I ntroduction
Les expressions rgulires (dites aussi expressions rationnelles ) sont issue des recherches en mathmatiques dans le domaine des automates. Les abrviations reconnues sont regexp et regex . Une regex sapparente une expression mathmatique, car on y trouve des oprateurs, des valeurs et des variables. Les regex permettent de se lancer la recherche de motifs dcrits par la combinaison doprateurs et de valeurs. Une utilisation rcurrente des regex consiste en la recherche de mots cls dans des fichiers ou dans une base de donnes ou encore en la vrification des donnes saisies par lutilisateur afin de sassurer quelles respectent un format prdfini, ou mme doprer des conversions de format.
Hugo Etivant http://cyberzoide.developpez.com 2

LAPI Regex de Java


Java fourni dans son JDK depuis la version 1.4 une API standard permettant la manipulation dexpressions rgulires. La documentation (en anglais) de cette API se trouve ici : http:/ / java.sun.com/ j2se/ 1.4.2/ docs/ api/ index.html LAPI doit tre importe en dbut de fichier de dfinition de classe comme suit : import java.util.regex.* ;

Hugo Etivant

http://cyberzoide.developpez.com

Objets de lAPI Regex


Ils existe deux classes et une exception : Pattern Reprsentation compile dun motif. Matcher Moteur de recherche dun motif dans une chane de caractres. PatternSyntaxException Exception lance lorsquune erreur apparat dans la syntaxe des motifs employs.
Hugo Etivant http://cyberzoide.developpez.com 4

Premier exemple
import java.io.*; import java.util.regex.*; public class testRegex { private static Pattern pattern; private static Matcher matcher; public static void main(String args[]) { pattern = Pattern.compile("Hugo"); matcher = pattern.matcher("Hugo Etivant"); while(matcher.find()) { System.out.println("Trouv !"); } } }

Cet exemple recherche le motif Hugo dans la chane Hugo Etivant et affiche Trouv ! pour chaque occurrence du motif dans la chane.
Hugo Etivant http://cyberzoide.developpez.com 5

Syntaxe des motifs


La syntaxe des motifs est trs riche. 1. 2. 3. 4. 5. 6. Chanes littrales Mta caractres Classes de caractres Quantificateurs Groupes de capture Frontires de recherche

Hugo Etivant

http://cyberzoide.developpez.com

Chanes littrales
La syntaxe la plus aise consiste recherche une simple chane de caractres au sein dune autre. Exemple : Motif : "simple chane de caractres" Chane traiter : "autre simple chane de caractres" Rsultat trouv : "simple chane de caractres"

Hugo Etivant

http://cyberzoide.developpez.com

Mta caractres

( 1)

Ltape suivante dans la complexit consiste ajouter des symboles particuliers dont la signification est quils remplacent dautres caractres. Un peu comme la lettre blanche aux scrabbles qui reprsente nimporte quelle lettre. Sauf quici un grand nombre de symboles existent, ils peuvent tre combins entre eux et donner des expressions complexes. Exemple : Motif : "voiture." Chane traiter : "les voitures" Rsultat trouv : "voitures" Le caractres spcial . remplace nimporte quel caractre.
Hugo Etivant http://cyberzoide.developpez.com 8

Mta caractres
Voici la liste des mta caractres :
Caractre . * ? () [] {} \ ^ $ | +
Hugo Etivant

( 2)

Description Remplace tout caractre Remplace une chane de 0, 1 ou plusieurs caractres Remplace exactement un caractre Groupe capturant Intervalle de caractres Quantificateur Dspcialise le caractre spcial quil prcde Ngation ou dbut de ligne Fin de ligne Ou logique entre deux sous-motifs Numrateur
http://cyberzoide.developpez.com 9

Classes de caractres

( 1)

Une classe de caractres est un ensemble de caractres. Il existe des classes prdfinies par lAPI mais dautres ensembles peuvent tre construits par le programmeur. Voici la liste des classes prdfinies :
Classe \d \D \s \S \w \W . Description Un chiffre, quivalent : [0-9] Un non chiffre : [^0-9] Un caractre blanc : [ \ t\ n\ x0B\ f\ r] Un non caractre blanc : [^\ s] Un caractre de mot : [a-zA-Z_0-9] Un caractre de non mot : [^\ w] Tout caractre

Attention : le caractre \ est un caractre spcial, il doit tre dspcialis lorsque un alias de classe ou tout autre mot cl des regex lutilise. Il est dspcialis lorsquil est doubl \ \ .
Hugo Etivant http://cyberzoide.developpez.com 10

Classes de caractres
Exemples : Motif : "\ d" Chane traiter : "jai 2 voitures" Rsultat trouv : "2"

( 2)

Motif : "\ W" Chane traiter : "jai 2 voitures" Rsultats trouvs : "", " ", " " (lapostrophe et les deux espaces)

Hugo Etivant

http://cyberzoide.developpez.com

11

Classes de caractres
Voici les rgles de constructions des classes personnalises :
Classe [abc] [ ^ abc] [a-z] [a-zA-Z] [a-z[ A-Z] ] [abc&&[a-z]] Description

( 3)

Ensemble simple, remplace tout caractre parmi lun des caractres suivants : a, b et c Ngation de lensemble prcdent Ensemble complexe, remplace tout caractre parmi ceux de lalphabet naturel compris entre a et z Union densembles, remplace tout caractre de lalphabet minuscule ou majuscule Intersection densembles, remplace tout caractre faisant parti de lensemble : a, b, c et aussi de lensemble de a jusqu z (cest--dire uniquement a, b et c)

[a-z&&[ ^ abc]] Soustraction densembles, remplace tout caractre de lalphabet compris entre a et z, except ceux de lintervalle suivant : a, b et c
Hugo Etivant http://cyberzoide.developpez.com 12

Classes de caractres
Exemples :
Motif "[ A-Z] " "[ AbfTz] " "[ ^ 0-9] " "[ \ w&&[ ^ 13579] ] " "[ 123&&[ 1-9] ] " "[ 123&&[ 1-9] ] " "[ 0-9&&[ ^ 123] ] " "[ 0-9&&[ ^ 123] ] " Chane "abc" "lAmour" "as" "getId23" "5" "1" "3" "8" Rsultat( s) aucun "A" "a", "s"

( 4)

"g", "e", "t", "I", "d", "2" aucun "1" aucun "8"

Hugo Etivant

http://cyberzoide.developpez.com

13

Quantificateurs

( 1)

Un quantificateur permet de spcifier le nombre doccurrences dun sous-motif du motif. En voici la liste :
Quantificateurs Avide X? X* X+ X{ n} X{ n,} X{ n, m} Rticent X?? X* ? X+ ? X{ n} ? X{ n,} ? X{ n, m} ? Possessif X?+ X* + X+ + X{ n} + X{ n,} + X{ n, m} + Description Une fois ou pas du tout Zro, une ou plusieurs fois Une ou plusieurs fois Exactement n fois Au moins n fois Au moins n fois et jusqu m fois
14

Hugo Etivant

http://cyberzoide.developpez.com

Quantificateurs

( 2)

Il existe trois classes de quantificateurs : - les avides (greedy) : lecture de toute la chane dentre avant de rechercher des occurrences en partant de la fin dans le but de trouver le maximum doccurrences, - les rticents (reluctant) : lecture de la chane dentre caractre par caractre la recherche des occurrences, - les possessifs (possessive) : lecture de toute la chane dentre avant de chercher une occurrence. Certains quantificateurs rendent satisfaisant des chanes qui ne comportent pas la chane du motif. Par exemple le motif "a* " correspond trouver zro fois ou plus la lettre a. Parmi les rsultats de la recherche, un chane vide "" apparatra car vrifiera le motif.

Hugo Etivant

http://cyberzoide.developpez.com

15

Quantificateurs
Exemples :
Motif "(to)+ " "(to)* " "(to)?" "a{ 2} " "a?" "a+ " "a+ + " "a+ ?" "a{ 2,4} " "[ 0-9] { 4} "
Hugo Etivant

( 3)
Rsultat( s) "toto" "toto", "" chane vide de fin "to", "to", "" chane vide de fin "aa", "aa" "a", "a", "a", "a", "" chane vide de fin "aaaa" "aaaa" "a", "a", "a", "a" "aaaa" "1997", "2004"
16

Chane "toto" "toto" "toto" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "from 1997 to 2004 for the 2nd time"

http://cyberzoide.developpez.com

Groupes de captures

( 1)

Les parenthses utilises dans les regex permettent de crer des groupes de sous-motifs. Par exemple, le motif "(a((bc)(d)))" dfini 4 groupes : "(a((bc)(d)))", "((bc)(d))", "(bc)" et "(d)". Il sont numrots de gauche droite selon lordre de leur parenthse ouvrante. Le groupe 0 contient toujours lexpression entire mme si aucun groupe nest dfini. Lors de lexcution de la regex par le moteur Matcher sur une chane, les sous-chanes vrifiant les sous-motifs dfinis par chacun des groupes seront captures, cest-dire conserves en mmoire et pourront tre rutilises.
Hugo Etivant http://cyberzoide.developpez.com 17

Groupes de captures
Exemple : Motif : "(a((b)(c)))" - groupe 0 : (a((b)(c))) - groupe 1 : (a((b)(c))) - groupe 2 : ((b)(c)) - groupe 3 : (b) - groupe 4 : (c) Chane traiter : "abc" Rsultats trouvs : - groupe 0 : "abc", - groupe 1 : "abc", - groupe 2 : "bc", - groupe 3 : "b", - groupe 4 : "c"
Hugo Etivant http://cyberzoide.developpez.com

( 2)

18

Groupes de captures

( 3)

Aprs application de la regex sur une chane, il est possible de connatre le nombre de sous-chanes captures avec la mthode groupCount() de lobjet Matcher. La mthode group(int group) retourne la sous-chane capture par le groupe ngroup.

Hugo Etivant

http://cyberzoide.developpez.com

19

Groupes de captures exemple a ( 4)


// compilation de la regex Pattern p = Pattern.compile("(a((b)(c)))"); // cration dun moteur de recherche Matcher m = p.matcher("abc"); // lancement de la recherche de toutes les occurrences boolean b = m.matches(); // si recherche fructueuse if(b) {

Affiche : Groupe 0 Groupe 1 Groupe 2 Groupe 3 Groupe 4 : : : : : abc abc bc b c

// pour chaque groupe for(int i=0; i<=m.groupCount(); i++) { // affichage de la sous-chane capture System.out.println("Groupe " + i + " : " + m.group(i)); } }
Hugo Etivant http://cyberzoide.developpez.com

20

Groupes de captures exemple b ( 5)


/ / compilation de la regex Pattern p = Pattern.compile("(a((b)(c)))"); / / cration dun moteur de recherche Matcher m = p.matcher("abc"); / / lancement de la recherche de toutes les occurrences successives while(m.find()) { / / affichage de la sous-chane capture, / / de lindex de dbut dans la chane originale / / et de lindex de fin System.out.println("Le texte \ "" + m.group() + "\ " dbute " + m.start() + " et termine " + m.end()); } Affiche : Le texte "abc" dbute 0 et termine 3.
Hugo Etivant http://cyberzoide.developpez.com 21

Groupes de captures mthodes

( 6)

Voici quelques mthodes courantes relatives aux sous-chanes captures, cest--dire aux rsultats de la recherche du motif dans une chane dentre :
Mthode int groupCount() string group() string group(int group) boolean find() boolean find(int start) int start() int start(int group) int end() int end(int group) Description Nombre de sous-chanes captures Sous-chane capture par la dernire recherche Sous-chane capture par le groupe group Recherche de la prochaine sous-chane satisfaisant la regex Recherche de la prochaine sous-chane satisfaisant la regex, en commenant la recherche lindex start Index de dbut de la sous-chane capture Index de dbut de la sous-chane capture par le groupe group Index de fin de la sous-chane capture Index de fin de la sous-chane capture par le groupe group

Hugo Etivant

http://cyberzoide.developpez.com

22

Groupes de captures rfrences

( 7)

Au sein du motif, on peut ajouter une rfrence un groupe du mme motif. Syntaxe : \ i o i est le numro de groupe. Exemples : Motif : "(\ d\ d)\ 1" Motif : "(\ d\ d)\ 1" Chane traiter : "1789" Chane traiter : "1515" Rsultat trouv : aucun Rsultat trouv : "1515" Dans cet exemple, le premier groupe capturant est (\ d\ d) cest--dire deux chiffres successifs. La suite du motif : \ 1 signifie quil faut trouver la suite de la sous-chane vrifiant \ d\ d une sous-chane identique celle capture. 1) Ici, 15 est la sous-chane capture par (\ d\ d), sa suite, 15 est effectivement identique la premire. 2) Ici, 17 est capture, mais 89 qui la suit ne lui est pas gale, mme si elle vrifie le motif initial \ d\ d elle nest pas gale loccurrence capture.
Hugo Etivant http://cyberzoide.developpez.com 23

Frontires de recherche

( 1)

Il est dsormais intressant de forcer lemplacement des motifs recherchs : en dbut de ligne, en fin de mot Les spcificateurs de frontire sont rsums dans le tableau suivant :
Spcificateur ^ $ \b \B \A \G \Z \z
Hugo Etivant

Description Dbut de ligne Fin de ligne Extrmit de mot Extrmit dun non mot Dbut de la chane soumise Fin de loccurrence prcdente Fin de la chane soumise, lexclusion du caractre final Fin de la chane soumise
http://cyberzoide.developpez.com 24

Frontires de recherche
Exemples :
Motif "^ java$" "^ java$" "cin\ b" "cin\ b" "\ Gjava" Chane "java" "le java" "je vais au cin" "je vais au cinma" "java java" Rsultat( s) "java" aucun "cin" aucun

( 2)

"java" (le premier, car le deuxime napparat pas aprs le premier mais aprs le caractre espace) "java", "java" (les deux)

"\ Gjava"

"javajava"

Hugo Etivant

http://cyberzoide.developpez.com

25

Options pour les regex

( 1)

La mthode de compilation dexpression rgulire prend pour paramtres la regex et un paramtre optionnel flags. Syntaxe : static Pattern compile(String regex, int flags) Liste des options :
Constante CANON_EQ CASE_INSENSITIVE COMMENTS DOTALL MULTILINE UNICODE_CASE UNIX_LINES
Hugo Etivant

Description Autorise lquivalence canonique Insensibilit la casse Autorise les espaces et commentaires dans la regex Autorise le mode point tout (dotall) Autorise le mode multilignes Autorise la gestion des caractres Unicode Autorise le codage Unix des fins de ligne
http://cyberzoide.developpez.com 26

Options pour les regex

( 2)

Ces options existent sous la forme de constantes de type entier (static int) dans la classe Pattern. Plusieurs options peuvent tre combines grce loprateurs OU binaire : | . Exemples : Pattern p = Pattern.compile("^ [ abc] $", Pattern.CASE_INSENSITIVE); Pattern p = Pattern.compile ("^ [ abc] $", Pattern.MULTILINE | Pattern.UNIX_LINES);
Hugo Etivant http://cyberzoide.developpez.com 27

Options embarques

( 3)

Nous avons vu comment passer ces options en paramtre la mthode compile(). Il est galement possible dcrire ces options directement dans le motif de la regex. Elles doivent tre places en tout dbut.
Constante CANON_EQ CASE_INSENSITIVE COMMENTS DOTALL MULTILINE UNICODE_CASE UNIX_LINES quivalent embarqu aucun (?i) (?x) (?s) (?m) (?u) (?d)

Hugo Etivant

http://cyberzoide.developpez.com

28

Options embarques
Exemple : Motif : "( ?i) foobar" Chane traiter : "FooBar, foobar, FOOBAR" Rsultats trouvs : "FooBar", "foobar", "FOOBAR"

( 4)

Hugo Etivant

http://cyberzoide.developpez.com

29

Mthode matches( ) Matcher

( 1)

La mthode matches() retourne vrai (true) si une chane vrifie un motif. Cette mthode existe dans les classes Matcher et Pattern. Objet Matcher Syntaxe : boolean matches() ; Exemple : / / compilation de la regex Pattern p = Pattern.compile("(a((b)(c)))"); / / cration dun moteur de recherche Matcher m = p.matcher("abc"); / / lancement de la recherche de toutes les occurrences boolean b = m.matches();

Hugo Etivant

http://cyberzoide.developpez.com

30

Mthode matches( ) Pattern


Dans la classe Pattern, cette mthode peut tre appele plus rapidement. Objet Pattern Syntaxe : static boolean matches(String regex, CharSequence input) Exemple : / / lancement de la recherche de toutes les occurrences boolean b = Pattern.matches("(a((b)(c)))", "abc");

( 2)

Hugo Etivant

http://cyberzoide.developpez.com

31

Mthode split( )

( 1)

La mthode split() de la classe Pattern permet de scinder une chane en plusieurs sous-chanes grce un dlimiteur dfini par un motif. Le paramtre optionnel limit permet de fixer le nombre maximum de souschanes gnres. Elle retourne un tableau de String. Syntaxe : String[ ] split(CharSequence input [ , int limit] ) Exemple : / / compilation de la regex Pattern p = Pattern.compile(":"); / / sparation en sous-chanes String[ ] items = p.split("un:deux:trois");
Hugo Etivant http://cyberzoide.developpez.com 32

Mthode split( ) exemple


Exemple complet : / / compilation de la regex Pattern p = Pattern.compile("\ \ W"); / / sparation en sous-chanes String[ ] items = p.split("Jaime le chocolat.", 10); / / parcours du tableau des sous-chanes for(int i= 0; i< items.length; i+ + ) { System.out.println(items[ i] ); }

( 2)

Cet exemple scinde une phrase en ses 10 premiers mots. Le motif \ W signifie tout caractre de non mot. Le rsultat est le suivant : J, aime, le, chocolat.
33

Hugo Etivant

http://cyberzoide.developpez.com

Remplacements

( 1)

La classe Matcher offre des fonctions qui permettent de remplacer les occurrences dun motif par une autre chane. Syntaxe : String replaceFirst(String replacement) String replaceAll(String replacement) Ces mthodes remplacent respectivement la premire occurrence et toutes les occurrences du motif de la regex compile associs au moteur.

Hugo Etivant

http://cyberzoide.developpez.com

34

Remplacements exemple
Exemple complet :

( 2)

/ / compilation de la regex avec le motif : "th" Pattern p = Pattern.compile("th"); / / cration du moteur associ la regex sur la chane "Jaime le th." Matcher m = p.matcher("Jaime le th."); / / remplacement de toutes les occurrences de "th" par "chocolat" String s = m.replaceAll("chocolat"); Dans cette exemple, la chane darrive s contient : "Jaime le chocolat.".

Hugo Etivant

http://cyberzoide.developpez.com

35

Historique
05 aot 2004 : corrections mineures 22 mai 2004 : premire publication (36 diapos) 20 mai 2004 : cration du document (20 diapos) Agissez sur la qualit de ce document en envoyant vos critiques et suggestions lauteur. Pour toute question technique, se reporter au forum Java de Developpez.com Reproduction autorise uniquement pour un usage non commercial. Hugo Etivant cyberzoide@yahoo.fr http:/ / cyberzoide.developpez.com/

Hugo Etivant

http://cyberzoide.developpez.com

36

Vous aimerez peut-être aussi