JavaRush /Blog Java /Random-FR /RegEx : 20 petites étapes pour maîtriser les expressions ...
Artur
Niveau 40
Tallinn

RegEx : 20 petites étapes pour maîtriser les expressions régulières. Partie 2

Publié dans le groupe Random-FR
RegEx : 20 petites étapes pour maîtriser les expressions régulières. Partie 1 Original ici Dans la dernière partie, nous avons maîtrisé les expressions régulières les plus simples et avons déjà appris quelque chose. Dans cette partie, nous étudierons des conceptions légèrement plus complexes, mais croyez-moi, ce ne sera pas aussi difficile qu'il y paraît. RegEx : 20 petites étapes pour maîtriser les expressions régulières.  Partie 2 - 1Alors continuons !

Étape 8 : Étoile *et signe plus+

RegEx : 20 petites étapes pour maîtriser les expressions régulières.  Partie 2 - 2Jusqu’à présent, nous n’avons plus ou moins pu faire correspondre que des chaînes d’une longueur donnée. Mais dans les derniers problèmes, nous avons atteint la limite de ce que nous pouvons faire avec la notation que nous avons vue jusqu'à présent. Supposons, par exemple, que nous ne sommes pas limités aux identifiants Java à 3 caractères, mais que nous pouvons avoir des identifiants de n'importe quelle longueur. Une solution qui aurait pu fonctionner dans l’exemple précédent ne fonctionnera pas dans l’exemple suivant :
motif : [a-zA-Z_$]\w\w 
chaîne :   __e $12 3 3.2 fo Bar r a23 mm ab x
correspondances : ^^^ ^^^ ^^^ ^^^  
( Exemple ) noteque lorsqu'un identifiant est valide mais comporte plus de 3 caractères, seuls les trois premiers caractères correspondent. Et lorsque l’identifiant est valide, mais contient moins de 3 caractères, alors la regex ne le trouve pas du tout ! Le problème est que les expressions entre crochets []correspondent exactement à un caractère, tout comme les classes de caractères telles que \w. Cela signifie que toutes les correspondances dans l’expression régulière ci-dessus doivent comporter exactement trois caractères. Cela ne fonctionne donc pas aussi bien que nous aurions pu l’espérer. *Les caractères spéciaux et peuvent aider ici +. Ce sont des modificateurs qui peuvent être ajoutés à droite de n’importe quelle expression pour correspondre à cette expression plus d’une fois. L'étoile Kleene (ou « astérisque ») *indiquera que le jeton précédent doit être mis en correspondance un certain nombre de fois, y compris zéro fois. Le signe plus +indiquera que vous devez effectuer une recherche une ou plusieurs fois. Ainsi, l'expression qui précède +est obligatoire (au moins une fois), tandis que l'expression qui précède *est facultative, mais lorsqu'elle apparaît, elle peut apparaître un nombre illimité de fois. Maintenant, avec cette connaissance, nous pouvons corriger l'expression régulière ci-dessus :
motif : [a-zA-Z_$]\w* 
chaîne :   __e 123 $ 3,2 pour Barr a23mm ab x 
correspond : ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^ 
( Exemple ) Maintenant, nous faisons correspondre les identifiants valides de n'importe quelle longueur ! Bingo ! Mais que se passerait-il si nous utilisions ? +au lieu de *?
motif : [a-zA-Z_$]\w+ 
chaîne :   __e 123 $ 3,2 pour Barr a23 mm ab x
correspondances : ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ 
( Exemple ) Nous avons raté le dernier match, х. En effet, il faut +qu'au moins un caractère corresponde, mais comme l'expression entre parenthèses []précédente \w+a déjà « mangé » le caractère x, il n'y a plus de caractères disponibles, donc la correspondance échoue. Quand peut-on l'utiliser +? Lorsque nous devons trouver au moins une correspondance, mais le nombre de fois qu’une expression donnée doit correspondre n’a pas d’importance. Par exemple, si nous voulons rechercher des nombres contenant un point décimal :
motif : \d*\.\d+ 
chaîne :   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
correspondances : ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
( Exemple ) notequ'en rendant facultatifs les nombres à gauche du point décimal, nous avons pu trouver à la fois 0,011 et 0,2. Pour ce faire, nous devions faire correspondre exactement un point décimal avec \.et au moins un chiffre à droite du point décimal avec \d+. L'expression régulière ci-dessus ne correspondra pas à un nombre comme 3., car nous avons besoin d'au moins un chiffre à droite de la virgule décimale pour correspondre.

Comme d’habitude, résolvons quelques problèmes simples :

Trouvez tous les mots anglais dans le passage ci-dessous.
modèle:
chaîne : 3 plus 3 font six mais 4 plus trois font 7
correspondances :    ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^ 
( Solution ) Recherchez tous les symboles de taille de fichier dans la liste ci-dessous. La taille des fichiers sera composée d'un nombre (avec ou sans point décimal) suivi de KB, MBou : GBTB
modèle:
chaîne :   11 To 13 14,4 Mo 22 Mo 9,9 Go To 0 
Ko correspond à : ^^^^ ^^^^^^ ^^^^^ ^^^  
( Solution )

Étape 9 : point d'interrogation "facultatif"?

RegEx : 20 petites étapes pour maîtriser les expressions régulières.  Partie 2 - 3Avez-vous déjà écrit une regex pour résoudre le dernier problème ? Est-ce que ça a marché ? Essayez maintenant de l'appliquer ici :
modèle:
chaîne : 1..3 Ko 5... Go ..6 To
allumettes:  
Évidemment, aucune de ces désignations ne correspond à une taille de fichier valide, donc une bonne expression régulière ne doit correspondre à aucune d’elles. La solution que j'ai écrite pour résoudre le dernier problème les correspond à tous, au moins en partie :
modèle : \d+\.*\d*[KMGT] 
Chaîne B :   1..3KB  5...GB .. 6TB 
correspond : ^^^^^^ ^^^^^^ ^^^ 
( Exemple ) Alors, quel est le problème ? En fait, il suffit de trouver un seul point décimal, s’il y en a un. Mais *il autorise n’importe quel nombre de matchs, y compris zéro. Existe-t-il un moyen de faire correspondre seulement zéro fois ou une seule fois ? Mais pas plus d'une fois ? Bien sûr. "facultatif" ?est un modificateur qui correspond à zéro ou à l'un des caractères précédents, mais pas plus :
modèle : \d+\.?\d*[KMGT] 
Chaîne B : 1.. 3 Ko 5...GB .. 6
To correspond :     ^^^ ^^^ 
( Exemple ) Nous sommes plus proches d'une solution ici, mais ce n'est pas tout à fait ce dont nous avons besoin. Nous verrons comment résoudre ce problème en quelques étapes un peu plus tard.

En attendant, résolvons ce problème :

Dans certains langages de programmation (par exemple Java), certains nombres entiers et à virgule flottante (point) peuvent être suivis de l/ Let f/ Fpour indiquer qu'ils doivent être traités comme long/float (respectivement) plutôt que comme un int/double normal. Trouvez tous les numéros « longs » valides dans la ligne ci-dessous :
modèle:
chaîne :   13L de long 2l 19 L lL 0 
correspondances : ^^^ ^^ ^^ ^ 
( Solution )

Étape 10 : signe « ou »|

RegEx : 20 petites étapes pour maîtriser les expressions régulières.  Partie 2 - 4À l’étape 8, nous avons eu quelques difficultés à trouver les différents types de nombres à virgule flottante :
motif : \d*\.\d+ 
chaîne :   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
correspondances : ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
Le modèle ci-dessus fait correspondre les nombres avec un point décimal et au moins un chiffre à droite du point décimal. Mais que se passe-t-il si nous voulons également faire correspondre des chaînes comme 0.? (Aucun chiffre à droite du point décimal.) Nous pourrions écrire une expression régulière comme celle-ci :
modèle : \d*\.\d* 
chaîne :   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . 
correspondances : ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ ^ 
( Exemple ) Cela correspond 0., mais cela correspond également à un seul point ., comme vous pouvez le voir ci-dessus. En fait, ce que nous essayons de faire correspondre, ce sont deux classes de chaînes différentes :
  1. nombres avec au moins un chiffre à droite de la virgule décimale
  2. nombres avec au moins un chiffre à gauche de la virgule décimale
Écrivons les 2 expressions régulières suivantes, indépendantes l'une de l'autre :
modèle : \d*\.\d+ 
chaîne :   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
correspondances : ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^  
modèle : \d+\.\d* 
chaîne :   0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. .
correspondances : ^^^^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
On voit que dans aucun de ces cas les sous-chaînes 42, 5, 6ou ne .sont trouvées par le moteur. Pour obtenir le résultat souhaité, cela ne nous ferait pas de mal de combiner ces expressions régulières. Comment pouvons-nous y parvenir? Le signe « ou » |permet de spécifier plusieurs séquences possibles de correspondances à la fois dans une expression régulière. Tout comme []le signe « ou » nous permet de spécifier des caractères uniques alternatifs, |nous pouvons spécifier des expressions alternatives à plusieurs caractères. Par exemple, si nous voulions trouver « chien » ou « chat », nous pourrions écrire quelque chose comme ceci :
pattern: \w\w\w 
string:   Évidemment , un chien est un meilleur animal de compagnie qu'un chat .
correspondances : ^^^^^^^^^ ^^^ ^^^^^^ ^^^ ^^^ ^^^ 
( Exemple ) ... mais cela correspond à toutes les séquences de caractères triples de la classe " mot ". Mais "chien" et "chat" n'ont même pas de lettres en commun, donc les crochets ne nous aideront pas ici. Voici l’expression régulière la plus simple que nous pourrions utiliser et qui corresponde à ces deux mots et uniquement à ces deux mots :
pattern: dog|cat 
string: De toute évidence, un chien est un meilleur animal de compagnie qu'un chat .
correspondances :               ^^^ ^^^ 
( Exemple ) Le moteur d'expression régulière essaie d'abord de faire correspondre la séquence entière à gauche du caractère |, mais s'il échoue, il essaie ensuite de faire correspondre la séquence à droite du caractère |. Plusieurs caractères |peuvent également être chaînés pour correspondre à plus de deux séquences alternatives :
pattern: dog|cat|pet 
string: De toute évidence, un chien est un meilleur animal de compagnie qu'un chat .
correspondances :               ^^^ ^^^ ^^^ 
( Exemple )

Résolvons maintenant quelques autres problèmes pour mieux comprendre cette étape :

Utilisez le signe |pour corriger l'expression régulière décimale ci-dessus pour produire un résultat comme celui-ci :
modèle:
chaîne :   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 0. .
correspondances : ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^ ^^ 
( Solution ) Utilisez sign |, les classes de caractères, "optional" ?, etc. pour créer une seule expression régulière qui correspond à la fois aux nombres entiers et aux nombres à virgule flottante (points), comme indiqué dans le problème à la fin de l'étape précédente (ce problème est un peu plus compliqué, oui ;))
modèle:
chaîne :   42L 12 x 3,4f 6l 3,3 0F LF .2F 0. 
correspondances : ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^  
( Solution ) 20 petites étapes pour maîtriser les expressions régulières. Partie 3 RegEx : 20 courtes étapes pour maîtriser les expressions régulières. Partie 4
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION