Les expressions régulières définissent des modèles de chaînes.
Les expressions régulières peuvent être utilisées pour rechercher, modifier ou manipuler du texte.
Les expressions régulières ne se limitent pas à une seule langue, mais il existe des différences subtiles dans chaque langue.
Les expressions régulières Java ressemblent le plus à celles de Perl.
Le package java.util.regex comprend principalement les trois classes suivantes :
Classe de modèle :
L'objet pattern est une représentation compilée d'une expression régulière. La classe Pattern n’a pas de constructeur public. Pour créer un objet Pattern, vous devez d'abord appeler sa méthode de compilation statique publique, qui renvoie un objet Pattern. Cette méthode accepte une expression régulière comme premier paramètre.
Classe de correspondance :
L'objet Matcher est un moteur qui interprète et fait correspondre les chaînes d'entrée. Comme la classe Pattern, Matcher n'a pas de constructeur public. Vous devez appeler la méthode matcher de l'objet Pattern pour obtenir un objet Matcher.
PatternSyntaxException :
PatternSyntaxException est une classe d'exceptions non obligatoire qui représente une erreur de syntaxe dans un modèle d'expression régulière.
La capture de groupes est un moyen de traiter plusieurs personnages comme une seule unité, créée en regroupant les caractères entre parenthèses.
Par exemple, l'expression régulière (chien) crée un seul groupe contenant "d", "o" et "g".
Les groupes de capture sont numérotés en comptant leurs parenthèses ouvrantes de gauche à droite. Par exemple, dans l’expression ((A)(B(C))), il existe quatre de ces groupes :
((ABC)))
(UN)
(B(C))
(C)
Vous pouvez vérifier le nombre de groupes d'une expression en appelant la méthode groupCount de l'objet matcher. La méthode groupCount renvoie une valeur int, indiquant que l'objet matcher possède actuellement plusieurs groupes de capture.
Il existe également un groupe spécial (groupe 0) qui représente toujours l'expression entière. Le groupe n'est pas inclus dans la valeur de retour de groupCount.
L'exemple suivant montre comment rechercher une chaîne de chiffres à partir d'une chaîne donnée :
importer java.util.regex.Matcher ;
importer java.util.regex.Pattern ;
RegexMatches de classe publique
{
public static void main (String args[]){
// Recherche la chaîne selon le modèle spécifié String line = "Cette commande a été passée pour QT3000 ! OK ?";
Modèle de chaîne = "(.*)(\d+)(.*)";
//Créer un objet Pattern Pattern r = Pattern.compile(pattern);
// Créez maintenant l'objet matcher Matcher m = r.matcher(line);
si (m.find( )) {
System.out.println("Valeur trouvée : " + m.group(0) );
System.out.println("Valeur trouvée : " + m.group(1) );
System.out.println("Valeur trouvée : " + m.group(2) );
} autre {
System.out.println("AUCUNE CORRESPONDANCE");
}
}
}
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
Valeur trouvée : Cette commande a été passée pour QT3000, OK ?
Valeur trouvée : Cette commande a été passée pour QT300
Valeur trouvée : 0
personnage | illustrer |
---|---|
| Marquez le caractère suivant comme caractère spécial, texte, référence arrière ou caractère d'échappement octal. Par exemple, « n » correspond au caractère « n ». "n" correspond à un caractère de nouvelle ligne. La séquence "\" correspond à "" et "(" correspond à "(". |
^ | Correspond au début de la chaîne d'entrée. Si la propriété Multiline de l'objet RegExp est définie, ^ correspondra également à la position après "n" ou "r". |
$ | Correspond à la fin de la chaîne d'entrée. Si la propriété Multiline de l'objet RegExp est définie, $ correspondra également à la position avant "n" ou "r". |
* | Correspond au caractère ou à la sous-expression précédent zéro ou plusieurs fois. Par exemple, zo* correspond à « z » et « zoo ». * Équivalent à {0,}. |
+ | Correspond au caractère ou à la sous-expression précédent une ou plusieurs fois. Par exemple, « zo+ » correspond à « zo » et « zoo » mais pas à « z ». + Équivalent à {1,}. |
? | Correspond au caractère ou à la sous-expression précédent zéro ou une fois. Par exemple, « faire(s) ? » correspond à « faire » ou « faire » dans « fait ». ? Équivalent à {0,1}. |
{ n } | n est un entier non négatif. Correspond exactement n fois. Par exemple, "o{2}" ne correspond pas au "o" dans "Bob", mais correspond aux deux "o" dans "food". |
{ n ,} | n est un entier non négatif. Faites correspondre au moins n fois. Par exemple, "o{2,}" ne correspond pas au "o" de "Bob", mais correspond à tous les o de "foooood". "o{1,}" équivaut à "o+". "o{0,}" équivaut à "o*". |
{ n , m } | M et n sont des entiers non négatifs, où n <= m . Faites correspondre au moins n fois et au plus m fois. Par exemple, "o{1,3}" correspond aux trois premiers o de "fooooood". « o{0,1} » est équivalent à « o ? ». Remarque : Vous ne pouvez pas insérer d'espaces entre les virgules et les chiffres. |
? | Lorsque ce caractère suit immédiatement un autre qualificatif (*, +, ?, { n }, { n ,}, { n , m }), le modèle correspondant est « non gourmand ». Le modèle « non gourmand » correspond à la chaîne la plus courte possible, tandis que le modèle « gourmand » par défaut correspond à la chaîne la plus longue possible. Par exemple, dans la chaîne "oooo", "o+?" ne correspond qu'à un seul "o", tandis que "o+" correspond à tous les "o". |
. | Correspond à n'importe quel caractère sauf "rn". Pour faire correspondre n'importe quel caractère incluant "rn", utilisez un modèle tel que "[sS]". |
( modèle ) | Correspond à un modèle et capture la sous-expression correspondante. Les correspondances capturées peuvent être récupérées à partir de la collection « correspondances » résultante à l'aide des attributs $0…$9 . Pour faire correspondre le caractère entre crochets ( ), utilisez "(" ou ")". |
(?: modèle ) | Une sous-expression qui correspond au modèle mais ne capture pas la correspondance, c'est-à-dire qu'il s'agit d'une correspondance sans capture et ne stocke pas la correspondance pour une utilisation ultérieure. Ceci est utile lors de la combinaison de parties de motif à l'aide du caractère « ou » (|). Par exemple, 'industr(?:y|ies) est une expression plus économique que 'industry|industries'. |
(?= motif ) | Sous-expression qui effectue une recherche anticipée qui correspond à une chaîne au début d'une chaîne qui correspond à pattern . Il s'agit d'une correspondance sans capture, c'est-à-dire une correspondance qui ne peut pas être capturée pour une utilisation ultérieure. Par exemple, « Windows (?=95|98|NT|2000) » correspond à « Windows » dans « Windows 2000 » mais pas à « Windows » dans « Windows 3.1 ». Les anticipations de prédiction n'occupent pas de caractères, c'est-à-dire qu'après qu'une correspondance se produit, la correspondance suivante est recherchée immédiatement après la correspondance précédente, et non après les caractères qui composent l'anticipation de prédiction. |
(?! modèle ) | Sous-expression qui effectue une recherche anticipée vers l'arrière qui correspond à une chaîne de recherche qui ne se trouve pas au début d'une chaîne correspondant à pattern . Il s'agit d'une correspondance sans capture, c'est-à-dire une correspondance qui ne peut pas être capturée pour une utilisation ultérieure. Par exemple, « Windows (?!95|98|NT|2000) » correspond à « Windows » dans « Windows 3.1 » mais pas à « Windows » dans « Windows 2000 ». Les anticipations de prédiction n'occupent pas de caractères, c'est-à-dire qu'après qu'une correspondance se produit, la correspondance suivante est recherchée immédiatement après la correspondance précédente, et non après les caractères qui composent l'anticipation de prédiction. |
x | | Faites correspondre x ou y . Par exemple, « z|food » correspond à « z » ou « food ». '(z|f)ood' correspond à "zood" ou "food". |
[ xyz ] | Jeu de caractères. Correspond à n'importe quel caractère contenu dans . Par exemple, « [abc] » correspond au « a » dans « plain ». |
[^ xyz ] | Jeu de caractères inversé. Correspond à tous les caractères non inclus. Par exemple, "[^abc]" correspond à "p", "l", "i" et "n" dans "plain". |
[ az ] | Plage de caractères. Correspond à n’importe quel caractère dans la plage spécifiée. Par exemple, « [az] » correspond à n’importe quelle lettre minuscule comprise entre « a » et « z ». |
[^ az ] | Caractère de plage inversée. Correspond à tout caractère ne se trouvant pas dans la plage spécifiée. Par exemple, "[^az]" correspond à tout caractère qui n'est pas compris entre "a" et "z". |
b | Correspond à une limite de mot, c'est-à-dire à la position entre un mot et un espace. Par exemple, "erb" correspond au "er" dans "jamais", mais pas au "er" dans "verb". |
B | Correspondance des limites de non-mots. "erB" correspond au "er" dans "verb", mais pas au "er" dans "jamais". |
cx | Correspond au caractère de contrôle indiqué par x . Par exemple, cM correspond à Control-M ou à un caractère de retour chariot. La valeur de x doit être comprise entre AZ ou az. Si ce n'est pas le cas, c est supposé être le caractère "c" lui-même. |
d | Correspondance des caractères numériques. Équivalent à [0-9]. |
D | Correspond aux caractères non numériques. Équivalent à [^0-9]. |
f | Correspondances de flux de formulaire. Équivalent à x0c et cL. |
n | Correspondance de nouvelle ligne. Équivalent à x0a et cJ. |
r | Correspond à un caractère de retour chariot. Équivalent à x0d et cM. |
s | Correspond à n'importe quel caractère d'espacement, y compris les espaces, les tabulations, les sauts de formulaire, etc. Équivalent à [fnrtv]. |
S | Correspond à tout caractère autre qu'un espace. Équivalent à [^fnrtv]. |
t | Correspondance des onglets. Équivalent à x09 et cI. |
v | Correspondance des onglets verticaux. Équivalent à x0b et cK. |
w | Correspond à n’importe quel caractère, y compris le trait de soulignement. Équivalent à "[A-Za-z0-9_]". |
W | Correspond à n'importe quel caractère autre qu'un mot. Équivalent à "[^A-Za-z0-9_]". |
x n | Correspond à n , où n est un code d'échappement hexadécimal. Le code d’échappement hexadécimal doit comporter exactement deux chiffres. Par exemple, "x41" correspond à "A". "x041" équivaut à "x04"&"1". Autoriser les codes ASCII dans les expressions régulières. |
nombre | Correspond à num , où num est un entier positif. Backreference pour capturer la correspondance. Par exemple, "(.)1" correspond à deux caractères identiques consécutifs. |
n | Identifie un code d'échappement octal ou une référence arrière. Si n est précédé d'au moins n sous-expressions de capture, alors n est une référence arrière. Sinon, si n est un nombre octal (0-7), alors n est le code d'échappement octal. |
nm | Identifie un code d'échappement octal ou une référence arrière. Si nm est précédé d'au moins nm capturant des sous-expressions, alors nm est une référence arrière. Si nm est précédé d'au moins n captures, n est une référence arrière suivie du caractère m . Si aucune des conditions précédentes n'existe, nm correspond à la valeur octale nm , où n et m sont des chiffres octaux (0-7). |
nml | Lorsque n est un nombre octal (0-3) et m et l sont des nombres octaux (0-7), faites correspondre le code d'échappement octal nml . |
u n | Correspond à n , où n est un caractère Unicode représenté sous la forme d'un nombre hexadécimal à quatre chiffres. Par exemple, u00A9 correspond au symbole de droit d'auteur (©). |
La méthode index fournit des valeurs d'index utiles qui indiquent exactement où se trouve la correspondance dans la chaîne d'entrée :
numéro de série | Méthodes et instructions |
---|---|
1 | public int start() renvoie l'index initial de la correspondance précédente. |
2 | public int start(int group) Renvoie l'index initial de la sous-séquence capturée par le groupe donné lors de l'opération de correspondance précédente |
3 | public int end() renvoie le décalage après le dernier caractère correspondant. |
4 | public int end(int group) Renvoie le décalage après le dernier caractère de la sous-séquence capturée par le groupe donné lors de l'opération de correspondance précédente. |
La méthode de recherche examine la chaîne d'entrée et renvoie une valeur booléenne indiquant si le modèle a été trouvé :
numéro de série | Méthodes et instructions |
---|---|
1 | public booleanlookingAt() tente de faire correspondre une séquence d'entrée commençant au début de la plage à ce modèle. |
2 | public boolean find() tente de trouver la sous-séquence suivante de la séquence d'entrée qui correspond à ce modèle. |
3 | public boolean find(int start) Réinitialise ce matcher, puis tente de trouver la sous-séquence suivante de la séquence d'entrée en commençant à l'index spécifié qui correspond à ce modèle. |
4 | public boolean matches() tente de faire correspondre toute la plage avec le modèle. |
La méthode de remplacement est une méthode permettant de remplacer du texte dans la chaîne d'entrée :
numéro de série | Méthodes et instructions |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) implémente des étapes d'ajout et de remplacement non terminales. |
2 | public StringBuffer appendTail(StringBuffer sb) implémente les étapes d'ajout et de remplacement du terminal. |
3 | public String replaceAll(String remplacement) Remplace chaque sous-séquence de la séquence d'entrée dont le modèle correspond à la chaîne de remplacement donnée. |
4 | public String replaceFirst(String remplacement) Remplace la première sous-séquence de la séquence d'entrée dont le modèle correspond à la chaîne de remplacement donnée. |
5 | public static String quoteReplacement(String s) renvoie la chaîne de remplacement littérale de la chaîne spécifiée. Cette méthode renvoie une chaîne qui fonctionne comme une chaîne littérale passée à la méthode appendReplacement de la classe Matcher. |
Voici un exemple de comptage du nombre d'occurrences du mot « chat » dans une chaîne d'entrée :
importer java.util.regex.Matcher ;
importer java.util.regex.Pattern ;
RegexMatches de classe publique
{
chaîne finale statique privée REGEX = "\bcat\b";
chaîne finale statique privée INPUT =
"chat chat chat cattie chat";
public static void main (String args[]){
Modèle p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // Récupère l'objet matcher int count = 0;
while(m.find()) {
compte++;
System.out.println("Numéro correspondant "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
Match numéro 1
début() : 0
fin() : 3
Match numéro 2
début() : 4
fin() : 7
Match numéro 3
début() : 8
fin() : 11
Match numéro 4
début() : 19
fin() : 22
Vous pouvez voir que cet exemple utilise des limites de mots pour garantir que les lettres « c », « a », « t » ne sont pas simplement une sous-chaîne d'un mot plus long. Il fournit également des informations utiles sur l'endroit où la correspondance s'est produite dans la chaîne d'entrée.
La méthode start renvoie l'index initial de la sous-séquence capturée par le groupe donné lors de l'opération de correspondance précédente, et la méthode end en ajoute un à l'index du dernier caractère correspondant.
Les méthodes matches et LookingAt sont toutes deux utilisées pour essayer de faire correspondre un modèle de séquence d'entrée. La différence entre eux est que matches nécessite que la séquence entière corresponde, contrairement à LookingAt.
Ces deux méthodes sont souvent utilisées au début de la chaîne d'entrée.
Nous utilisons l'exemple suivant pour expliquer cette fonction :
importer java.util.regex.Matcher ;
importer java.util.regex.Pattern ;
RegexMatches de classe publique
{
chaîne finale statique privée REGEX = "foo";
chaîne finale statique privée INPUT = "fooooooooooooooooo";
modèle de modèle statique privé ;
Matcher Matcher statique privé ;
public static void main (String args[]){
motif = Modèle.compile(REGEX);
matcher = motif.matcher(INPUT);
System.out.println("Le REGEX actuel est : "+REGEX);
System.out.println("L'ENTRÉE actuelle est : "+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
La REGEX actuelle est : foo
L'ENTRÉE actuelle est : fooooooooooooooooo
LookingAt() : vrai
matches() : faux
Les méthodes replaceFirst et replaceAll sont utilisées pour remplacer le texte qui correspond à une expression régulière. La différence est que replaceFirst remplace la première correspondance et replaceAll remplace toutes les correspondances.
L'exemple suivant explique cette fonctionnalité :
importer java.util.regex.Matcher ;
importer java.util.regex.Pattern ;
RegexMatches de classe publique
{
chaîne statique privée REGEX = "chien" ;
private static String INPUT = "Le chien dit miaou. " +
"Tous les chiens disent miaou.";
chaîne statique privée REPLACE = "chat" ;
public static void main (String[] arguments) {
Modèle p = Pattern.compile(REGEX);
// récupère un objet matcher
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
Le chat dit miaou. Tous les chats disent miaou.
La classe Matcher fournit également les méthodes appendReplacement et appendTail pour le remplacement de texte :
Regardez l'exemple suivant pour expliquer cette fonctionnalité :
importer java.util.regex.Matcher ;
importer java.util.regex.Pattern ;
RegexMatches de classe publique
{
chaîne statique privée REGEX = "a*b" ;
chaîne statique privée INPUT = "aabfooaabfooabfoob" ;
chaîne statique privée REPLACE = "-";
public static void main (String[] arguments) {
Modèle p = Pattern.compile(REGEX);
// Récupère l'objet matcher Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
tandis que(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
Les résultats de compilation et d'exécution de l'exemple ci-dessus sont les suivants :
-foo-foo-foo-
PatternSyntaxException est une classe d'exceptions non forcées qui indique une erreur de syntaxe dans un modèle d'expression régulière.
La classe PatternSyntaxException fournit les méthodes suivantes pour nous aider à voir quelles erreurs se sont produites.
numéro de série | Méthodes et instructions |
---|---|
1 | public String getDescription() Obtient la description de l'erreur. |
2 | public int getIndex() obtient le mauvais index. |
3 | public String getPattern() obtient le mauvais modèle d'expression régulière. |
4 | public String getMessage() renvoie une chaîne multiligne contenant une description de l'erreur de syntaxe et de son index, le modèle d'expression régulière de l'erreur et une indication visuelle de l'index de l'erreur dans le modèle. |