Nous allons prendre comme exemple la recherche de nombres entiers dans une chaîne de caractères. Nous allons d'abord chercher le premier nombre dans une chaîne saisie au clavier.
import java.util.regex.*; public class ExtractInt{ public static void main(String[] args){ String st; Pattern motif; Matcher match; System.out.println("Entrez la chaîne à analyser"); st = System.console().readLine(); // l'expression régulière motif = Pattern.compile("(0|1|2|3|4|5|6|7|8|9)+"); match = motif.matcher(st); if (match.find()){ // le motif est trouvé System.out.println("Le nombre trouvé est: " +match.group()); }else{ System.out.println("Aucun nombre détecté dans la chaîne"); } } }
On voit dans cet exemple que l'objet instance de Pattern représente une expression régulière donné au moyen d'une chaîne de caractère. Dans cette chaîne, les chiffres sont considérés comme des symboles, la barre verticale et le + comme des opérateurs et les parenthèses sont utilisées pour définir la portée de l'opérateur +. Cet objet n'est pas créé au moyen d'un new (il n'y a pas de constructeur dans la classe Pattern) mais avec une méthode de classe (méthode static) qui s'appelle compile.
Ensuite une instance de Matcher est créée qui a pour but de rechercher des occurrences du motif dans une chaîne donnée. Dans notre exemple, la chaîne est entrée au clavier. L'objet instance de Matcher est créé par la méthode match de l'objet Pattern.
La méthode find permet de trouver la première occurrence du motif et la méthode group d'avoir la sous-chaîne qui correspond à cette première occurrence. Dans notre exemple, c'est le premier nombre (sous forme d'une chaîne de caractère String du point de vue de son type java).
Voici quelques exemples d'exécution.
> java ExtractInt Entrez la chaîne à analyser sqdfsqd 12sqd 56 Le nombre trouvé est: 12 > java ExtractInt Entrez la chaîne à analyser zaegfgfrzaegyryizaeyyugzaet Aucun nombre détecté dans la chaîne > java ExtractInt Entrez la chaîne à analyser fsqdfsqdfsqd124fsqdfsqd89fsqd12 Le nombre trouvé est: 124
Si on appelle deux fois find, le premier appel cherche la première occurrence et le second appel cherche la deuxième occurrence. Plus précisément, la recherche commence après la fin de la première occurrence trouvée. Si l'on veut toutes les occurrences du motif, il faut appeler en boucle la méthode find.
import java.util.regex.*; public class ExtractInt2{ public static void main(String[] args){ String st; Pattern motif; Matcher match; System.out.println("Entrez la chaîne à analyser"); st = System.console().readLine(); // l'expression régulière motif = Pattern.compile("(0|1|2|3|4|5|6|7|8|9)+"); match = motif.matcher(st); int nb = 1; while (match.find()){ // le motif est trouvé System.out.println("Le nombre numéro " + nb + " est: " + match.group()); nb++; } if (nb==1){ System.out.println("Aucun nombre n'est trouvé"); } } }
Voici deux exécutions du programme.
> java ExtractInt2 Entrez la chaîne à analyser 12fsqdfsqd58fsqdfsdq98fsqd45 Le nombre numéro 1 est: 12 Le nombre numéro 2 est: 58 Le nombre numéro 3 est: 98 Le nombre numéro 4 est: 45 > java ExtractInt2 Entrez la chaîne à analyser fsqdfsqdfsqd Aucun nombre n'est trouvé
On peut écrire différemment le motif qui recherche les nombres. On peut
utiliser une classe decaractère avec un intervalle. Le motif s'écrit alors:
"[0-9]+"
. On peut également utiliser la classe prédéfinie des chiffres
qui s'écrit \d
. Dans la chaîne java utilisée pour créer le motif, il
faut doubles toutes les barres obliques (mécanisme d'échappement). Il faut
écrire: Pattern.compile("\\d+")
.
Pour avoir une description complète de la syntaxe des expressions régulières, consultez la documentation de la classe Pattern: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html