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).
Classes de caractères prédéfinies
L'API de classePattern
contient des classes de caractères prédéfinies qui offrent des raccourcis pratiques vers les expressions régulières couramment utilisées. Dans 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, \d
signifie un chiffre (0-9), \w
signifie 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 \Q
et \E
de 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 : Dans 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
Les 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 : Dans 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 : les 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" : Expression 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" : le 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 : L'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 : Pour 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 : Dans 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.
GO TO FULL VERSION