JavaRush /Blog Java /Random-FR /Bases des expressions régulières en Java. Partie 3
articles
Niveau 15

Bases des expressions régulières en Java. Partie 3

Publié dans le groupe Random-FR
Continuons notre étude des expressions régulières. Dans cet article nous aborderons les classes de caractères prédéfinies ainsi que la quantification (recherche de séquences). Bases des expressions régulières en Java.  Partie 3 - 1

Classes de caractères prédéfinies

L'API de classe Patterncontient des classes de caractères prédéfinies qui offrent des raccourcis pratiques vers les expressions régulières couramment utilisées. Bases des expressions régulières en Java.  Partie 3 - 2Dans ce tableau, les constructions de la colonne de gauche sont des représentations abrégées des expressions de la colonne de droite. Par exemple, \dsignifie un chiffre (0-9), \wsignifie toute lettre majuscule ou minuscule, trait de soulignement ou chiffre). Utilisez des classes de caractères prédéfinies autant que possible. Cela rendra votre code plus facile à lire et corrigera les erreurs. Les constructions commençant par une barre oblique inverse sont appelées échappées ou protégées. Dans des articles précédents, nous avons déjà parlé de l'échappement des caractères spéciaux avec des barres obliques inverses ou des symboles \Qet \Ede leur utilisation comme caractères normaux. Si vous utilisez une barre oblique inverse avec des caractères normaux (littéraux), vous devez alors échapper la barre oblique inverse pour que l'expression soit compilée.
private final String REGEX = "\\d"; // цифра
Dans cet exemple \d, une expression régulière ; la barre oblique inverse supplémentaire est nécessaire à la compilation du programme. Notre programme de test lit les expressions régulières directement depuis la console, aucune barre oblique supplémentaire n'est donc nécessaire. L'exemple suivant illustre l'utilisation de classes de caractères prédéfinies : Bases des expressions régulières en Java.  Partie 3 - 3Bases des expressions régulières en Java.  Partie 3 - 4Dans les trois premiers exemples, l'expression régulière est simplement " ." (le caractère spécial point), ce qui signifie n'importe quel caractère. La recherche a donc réussi dans tous les cas. D'autres exemples utilisent des classes de caractères prédéfinies, dont nous avons discuté la signification dans le tableau ci-dessus.

Quantificateurs

Bases des expressions régulières en Java.  Partie 3 - 4Les quantificateurs vous permettent de spécifier le nombre d'occurrences d'un caractère dans une chaîne. Examinons de plus près les subtilités du fonctionnement des quantificateurs gourmands, paresseux et très gourmands. À première vue, il peut sembler que les quantificateurs X?, X?? et X?+ fonctionnent de la même manière : « X est présent une fois ou pas du tout. » Il existe de légères différences dans la mise en œuvre de ces quantificateurs, que nous examinerons ci-dessous.

Correspondances de longueur nulle

Commençons par le gourmand. Écrivons trois expressions régulières différentes : la lettre « a » avec des caractères spéciaux ?, * ou +. Voyons ce qui se passe si l'on teste ces expressions régulières sur une ligne vide : Bases des expressions régulières en Java.  Partie 3 à 5Dans l'exemple ci-dessus, la recherche a abouti dans les deux premiers cas, car les expressions a? et a* permettent que le caractère a soit absent de la chaîne. Notez également que les index de début et de dernière correspondance sont les mêmes (0). Puisque la chaîne d'entrée n'a pas de longueur, le programme ne trouve rien :) en première position. Ce cas est appelé correspondance de longueur nulle. De telles correspondances se produisent dans plusieurs cas : lorsque la ligne de saisie est vide, au début de la ligne de saisie, après le dernier caractère de la ligne ou entre des caractères de la ligne. Les correspondances de longueur nulle sont faciles à repérer : elles commencent et se terminent à la même position. Examinons d'autres exemples de correspondances de longueur nulle. Explorons les correspondances de longueur nulle avec quelques exemples supplémentaires. Remplaçons la chaîne d'entrée par le caractère "a" et observons un effet intéressant : Bases des expressions régulières en Java.  Partie 3 à 6les trois quantificateurs ont trouvé le caractère "a", mais les deux premiers, qui permettent l'absence de caractère, ont trouvé une correspondance de longueur nulle en position 1. - après le dernier caractère de la chaîne. Cela se produit parce que le programme traite le caractère « a » comme une chaîne et le « parcourt » jusqu'à ce qu'il n'y ait plus de correspondances. Selon le quantificateur utilisé, le programme trouvera ou non « rien » à la fin de la chaîne. Modifions maintenant la chaîne d'entrée en une séquence de cinq lettres "a" : Bases des expressions régulières en Java.  Partie 3 à 7Expression régulière a ? trouve une correspondance pour chaque lettre de la chaîne séparément. L'expression a* trouve deux correspondances : la séquence de caractères "a"' et une correspondance de longueur nulle en position 5. Et enfin, l'expression régulière a+ trouve uniquement la séquence de caractères « a », sans trouver « rien » :) Que se passera-t-il si une chaîne contenant différents caractères est donnée en entrée ? Par exemple, "ababaaaab" : Bases des expressions régulières en Java.  Partie 3 à 8le caractère "b" est aux positions 1, 3 et 8 et le programme trouve des correspondances de longueur nulle à ces positions. Expression régulière a? ne fait pas attention au "b", mais recherche simplement la présence (ou l'absence) du caractère "a". Si le quantificateur autorise l'absence de "a", tous les caractères de la chaîne autres que "a" seront affichés comme une correspondance de longueur nulle. Pour rechercher des séquences d'une longueur donnée, spécifiez simplement la longueur entre accolades : Bases des expressions régulières en Java.  Partie 3 à 9L'expression régulière a{3} recherche une séquence de trois caractères "a". Rien n'a été trouvé dans la première ligne car il n'y avait pas assez de a dans la ligne. Le second contient 3 caractères que le programme trouve. Le troisième test trouve également une correspondance au début de la chaîne. Tout ce qui se trouve après le 3ème caractère ne satisfait pas l'expression régulière, dans le code ci-dessous c'est le cas et il y aura plusieurs correspondances : Bases des expressions régulières en Java.  Partie 3 - 10Pour spécifier la longueur minimale de la séquence, utilisez :
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
Dans cet exemple, le programme ne trouve qu'une seule correspondance car la chaîne répond à l'exigence de longueur de séquence minimale de (3) caractères « a ». Enfin, définition de la longueur maximale de la séquence : Bases des expressions régulières en Java.  Partie 3 - 11Dans cet exemple, la première correspondance s'est terminée sur le sixième caractère. La deuxième correspondance contient des caractères après la sixième, car ils satisfont à l'exigence de longueur minimale. Si la chaîne était plus courte d’un caractère, il n’y aurait pas de deuxième correspondance.

Utiliser des groupes et des classes de caractères avec des quantificateurs

Jusqu’à présent, nous avons testé des quantificateurs sur des chaînes contenant le même caractère. Les quantificateurs ne s'appliquent qu'à un seul caractère, donc l'expression régulière « abc+ » correspondra une ou plusieurs fois aux chaînes contenant « ab » et « c ». Cela ne signifiera pas « abc » une ou plusieurs fois. Mais les quantificateurs peuvent être utilisés conjointement avec des groupes et des classes de caractères, tels que [abc]+ (a ou b ou c, une ou plusieurs fois) ou (abc)+ (« abc » une ou plusieurs fois). Trouvons un groupe de caractères (chien), trois fois dans une ligne : Bases des expressions régulières en Java.  Partie 3 - 12Dans le premier exemple, le programme trouve une correspondance, car le quantificateur s'étend à un groupe de caractères. Si vous supprimez les parenthèses, le quantificateur {3} ne s'appliquera qu'à la lettre « g ». Vous pouvez également utiliser des quantificateurs avec des classes de caractères : Bases des expressions régulières en Java.  Partie 3 - 13le quantificateur {3} s'applique à la classe de caractères entre parenthèses dans le premier exemple, et dans le second - uniquement au caractère « c ».

Différences entre les quantificateurs gourmands, paresseux et trop gourmands

Il existe de légères différences entre les quantificateurs avides, réticents et possessifs. Les quantificateurs gourmands sont ainsi nommés car ils essaient de trouver la correspondance la plus longue possible : le programme essaie d'abord de "manger" la chaîne entière, si une correspondance n'est pas trouvée, alors un caractère est ignoré et la recherche est répétée jusqu'à ce qu'une correspondance soit trouvée ou il ne reste plus aucun personnage. Les paresseux, quant à eux, commencent au début de la ligne, ajoutant caractère après caractère jusqu'à ce qu'ils trouvent une correspondance. Enfin, la quantification jalouse analyse la chaîne entière une fois, sans supprimer de caractères comme dans gloutonne. Pour la démonstration, nous utiliserons la chaîne xfooxxxxxxfoo. Bases des expressions régulières en Java.  Partie 3 - 14Le premier exemple utilise le quantificateur gourmand .* pour rechercher n'importe quel caractère, 0 fois ou plus, suivi des caractères "f" "o" "o". Le cantificateur étant gourmand, la correspondance trouvée contient la chaîne entière. Un quantificateur glouton ne trouvera pas toutes les correspondances dans une chaîne car dans un premier temps, après avoir analysé la chaîne entière, il trouvera une correspondance et terminera le travail. Le deuxième exemple est paresseux et commence au début de la ligne, en ajoutant caractère par caractère. Le programme commence par vérifier le « vide », mais depuis la séquence "foo" n'est pas en début de ligne, la recherche continue avec l'ajout du caractère "x", après quoi la première correspondance sera trouvée entre les indices 0 et 4. La recherche continue jusqu'à la fin de la ligne et la deuxième correspondance sera trouvée entre les indices 4 et 13. Le troisième exemple ne trouve pas de coïncidences car le quantificateur est jaloux. Dans ce cas, l'expression régulière .*+ "a mangé" la ligne entière, ne laissant rien pour "foo". Utilisez le quantificateur jaloux lorsque vous devez supprimer tout ce qui est inutile dans une chaîne, il sera plus efficace que le quantificateur gourmand équivalent. C'est tout! Lien vers la source : Bases des expressions régulières en Java. Partie 3
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION