Expressions régulières en Java : guide complet avec exemples de code
Les expressions régulières (regex) sont un outil puissant pour rechercher, extraire et remplacer du texte selon un motif. En Java, le travail avec les expressions régulières est implémenté via deux classes principales : java.util.regex.Pattern (compilation du motif) et java.util.regex.Matcher (exécution de la recherche). Dans cet article, nous analyserons la syntaxe, les méthodes principales et examinerons des exemples pratiques qui vous aideront à utiliser les regex en toute confiance dans des projets réels.
1. Bases du travail avec les expressions régulières en Java
Avant de passer aux exemples, examinons les classes clés et leur interaction.
Classe Pattern
Pattern est une représentation compilée de l'expression régulière. Elle est créée par la méthode statique Pattern.compile(). Sans compilation, il est impossible d'utiliser les regex.
Classe Matcher
Matcher est le « moteur » qui effectue la recherche selon le motif donné dans une chaîne. Il est créé par la méthode pattern.matcher(inputString).
Syntaxe de base des métacaractères
.— n'importe quel caractère (sauf le saut de ligne)\\d— un chiffre (0-9)\\w— une lettre, un chiffre ou un tiret bas\\s— un caractère d'espacement^— début de la chaîne$— fin de la chaîne*— 0 répétitions ou plus+— 1 répétition ou plus?— 0 ou 1 répétition{n,m}— de n à m répétitions[]— un ensemble de caractères (par exemple,[a-z]— n'importe quelle lettre minuscule)()— un groupe de capture
Exemple 1 : Vérification simple d'un numéro de téléphone
import java.util.regex.*;
public class PhoneValidator { public static void main(String[] args) { String phone = "+7 (999) 123-45-67"; String regex = "^\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(phone); if (matcher.matches()) { System.out.println("Numéro valide"); } else { System.out.println("Le numéro ne correspond pas au format"); } }}2. Méthodes de Matcher : matches(), find() et groupe de capture
Comprendre la différence entre matches() et find() est la clé pour travailler efficacement avec les regex en Java.
matches()— vérifie si toute la chaîne correspond entièrement au motif (ajoute implicitement^et$).find()— recherche une sous-chaîne correspondant au motif, à n'importe quel endroit de la chaîne.group()— retourne la correspondance trouvée ou la valeur du groupe de capture.
Exemple 2 : Extraction d'adresses email d'un texte avec find() et les groupes
import java.util.regex.*;
public class EmailExtractor { public static void main(String[] args) { String text = "Contacts : support@example.com, info@test.org et admin@site.net."; String regex = "([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\\\\.([a-zA-Z]{2,})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("Email complet : " + matcher.group()); System.out.println("Nom d'utilisateur : " + matcher.group(1)); System.out.println("Domaine : " + matcher.group(2)); System.out.println("Zone : " + matcher.group(3)); System.out.println("---"); } }}Exemple 3 : Validation d'un mot de passe avec matches()
Exigences : de 8 à 20 caractères, au moins une lettre majuscule, au