Programmation Java/Regex

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche


Syntaxe[modifier | modifier le wikicode]

Expressions rationnelles courantes
Caractère Type Explication
. Point n'importe quel caractère
[...] crochets classe de caractères : tous les caractères énumérés dans la classe
[^...] crochets et circonflexe classe complémentée : tous les caractères sauf ceux énumérés
^ circonflexe marque le début de la chaine, la ligne...
$ dollar marque la fin d'une chaine, ligne...
| barre verticale alternative - ou reconnaît l'un ou l'autre
(...) parenthèses groupe de capture : utilisée pour limiter la portée d'un masque ou de l'alternative
* astérisque 0, 1 ou plusieurs occurrences
+ le plus 1 ou plusieurs occurrence
? interrogation 0 ou 1 occurrence
Classes de caractères POSIX[1]
Classe Signification
[[:alpha:]] n'importe quelle lettre
[[:digit:]] n'importe quel chiffre
[[:xdigit:]] caractères hexadécimaux
[[:alnum:]] n'importe quelle lettre ou chiffre
[[:space:]] n'importe quel espace blanc
[[:punct:]] n'importe quel signe de ponctuation
[[:lower:]] n'importe quelle lettre en minuscule
[[:upper:]] n'importe quelle lettre capitale
[[:blank:]] espace ou tabulation
[[:graph:]] caractères affichables et imprimables
[[:cntrl:]] caractères d'échappement
[[:print:]] caractères imprimables exceptés ceux de contrôle
Expressions rationnelles Unicode[2]
Expression Signification
\A Début de chaine
\b Caractère de début ou fin de mot
\d Chiffre
\D Non chiffre
\s Caractères espace
\S Non caractères espace
\W Caractère qui n'est pas lettre, chiffre ou underscore
\w Lettre, chiffre ou underscore
\X Caractère Unicode
\z Fin de chaine

Débogueur : https://regex101.com/

Les expressions rationnelles en Java nécessitent le package java.util.regex.

Elles proposent les mêmes constructeurs spéciaux que le C++, soit X une expression :

  • (?:X) : groupe non capturant
  • (?>X) : groupe non capturant indépendant
  • (?=X) : avec lookahead positif
  • (?!X) : avec lookahead négatif
  • (?<=X) : avec lookbehind positif
  • (?<!X) : avec lookbehind négatif

Recherches[modifier | modifier le wikicode]

La classe Pattern offre la fonction matches qui renvoie un booléen : true (vrai) si la chaîne complète correspond à l'expression régulière, false (faux) sinon.

import java.util.regex.Pattern;
public class Regex
{
	public static void main(String[] args)
	{
		String chaine1 = "Test regex Java pour Wikibooks francophone.";
		System.out.println(Pattern.matches("[a-z]* Wikibooks",chaine1));
		System.out.println(Pattern.matches("[a-zA-Z ]* francophone\\.",chaine1));
	}
}
/*
	Affiche :
		false
		true
*/

La classe Matcher permet de trouver les résultats d'un expression avec différentes méthodes :

  1. find() : cherche le motif suivant et retourne un booléen indiquant si le motif défini par l'expression régulière a été trouvé.
  2. group() : retourne la chaîne trouvée (groupe 0).
  3. group(int) : retourne le groupe d'index spécifié. Le groupe 0 correspond à la chaîne comlète, les suivants correspondent à la paire de parenthèses capturante dans l'expression régulière.

Afficher ce qui est entre les balises HTML b :

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Regex
{
	public static void main(String[] args)
	{
		String chaine = "Test <b>regex</b> <i>Java</i> pour <b>Wikibooks</b> francophone.";
		Pattern p = Pattern.compile("<b>([^<]+)</b>"); // Capture du contenu entre <b> et </b> (groupe 1)
		Matcher m = p.matcher(chaine);
		while(m.find())
		{
			System.out.println(m.group());  // Tout le motif
			System.out.println(m.group(1)); // Le contenu entre <b> et </b>
		}
	}
}
/* Affiche :
 <b>regex</b>
 regex
 <b>Wikibooks</b>
 Wikibooks
*/

Remplacements[modifier | modifier le wikicode]

On utilise la méthode String.replaceAll().

Références[modifier | modifier le wikicode]

  • https://www.regular-expressions.info/posixbrackets.html
  • http://www.regular-expressions.info/unicode.html