Maison > Article > interface Web > Comment maîtriser rapidement les expressions régulières ? Apprenez la grammaire régulière grâce à AST !
L'expression régulière est une formule logique pour les opérations sur les chaînes. Il s'agit d'une technologie importante et complexe lors du traitement des données textuelles. Alors comment maîtriser rapidement les expressions régulières ? L'article suivant recommande une méthode d'apprentissage : via l'AST. J'espère que cela aidera tout le monde !
Les expressions régulières sont essentiellement utilisées pour traiter des chaînes. Il est très pratique de les utiliser pour faire correspondre, extraire et remplacer des chaînes.
Cependant, l'apprentissage des expressions régulières est encore quelque peu difficile, comme des concepts tels que la correspondance gourmande, la correspondance non gourmande, la capture de sous-groupes et la non-capture de sous-groupes. Il est non seulement difficile à comprendre pour les débutants, mais aussi pour de nombreuses personnes qui l'ont fait. travaillé pendant plusieurs années, je ne le comprends pas.
Comment mieux apprendre les expressions régulières ? Comment maîtriser rapidement les expressions régulières ?
Recommandez une façon d'apprendre les règles régulières que je trouve très bonne : Apprendre via AST.
Le principe de correspondance des expressions régulières est d'analyser la chaîne de modèle en AST, puis d'utiliser cet AST pour faire correspondre la chaîne cible.
Diverses informations contenues dans la chaîne de modèle seront enregistrées dans AST après l'analyse. AST est un arbre de syntaxe abstraite. Comme son nom l'indique, c'est un arbre organisé selon une structure grammaticale. A partir de la structure d'AST, vous pouvez facilement connaître la syntaxe supportée par les expressions régulières.
Comment visualiser l'AST d'une expression régulière ?
Vous pouvez le visualiser visuellement via le site Web astexplorer.net :
Basculez le langage d'analyse vers RegExp et vous pourrez visualiser l'AST des expressions régulières.
Comme mentionné précédemment, AST est un arbre organisé selon la grammaire, donc diverses grammaires peuvent être facilement triées à partir de sa structure.
Apprenons ensuite diverses syntaxes du point de vue de l'AST :
Commençons par la plus simple, /abc/ Un tel régulier peut correspondre à la chaîne de 'abc', et son AST C'est comme ça. :
3 Char, les valeurs sont a, b, c, et le type est simple. La correspondance ultérieure consiste à parcourir l'AST et à faire correspondre ces trois caractères respectivement.
Nous l'avons testé à l'aide de l'API exec :
Le 0ème élément est la chaîne correspondante et index est l'index de départ de la chaîne correspondante. input est la chaîne d’entrée.
Essayons à nouveau les caractères spéciaux :
/ddd/ signifie correspondre à trois nombres, et d est un métacaractère (meta char) avec une signification particulière prise en charge par les expressions régulières.
Nous pouvons également voir d'AST que bien qu'ils soient également Char, leur type est bien méta :
Vous pouvez faire correspondre n'importe quel nombre grâce au métacaractère de d :
Lesquels sont des méta char et lesquels sont de simples caractères, c'est clair d'un coup d'œil via AST.
Regular prend en charge la spécification d'un ensemble de caractères via [], ce qui signifie qu'il peut correspondre à n'importe lequel des caractères.
Nous pouvons également voir sur AST qu'il est enveloppé d'une couche de CharacterClass, ce qui signifie classe de caractères, c'est-à-dire qu'il peut correspondre à n'importe quel caractère qu'il contient.
C'est effectivement le cas dans le test :
L'expression régulière prend en charge la spécification du nombre de fois qu'un certain caractère est répété, en utilisant la forme {from,to} ,
Par exemple, /b{1,3}/ signifie que le caractère b est répété 1 à 3 fois, et /[abc]{1,3}/ signifie que la classe de caractères a/b/c est répétée 1 à 3 fois.
Comme vous pouvez le voir sur AST, cette syntaxe s'appelle Répétition :
Elle a un attribut quantificateur pour représenter le quantificateur, et le type ici est une plage, de 1 à 3.
Regular prend également en charge les abréviations de certains quantificateurs, tels que + représentant 1 à un nombre incalculable de fois, * représentant 0 à un nombre incalculable de fois et ? représentant 0 ou 1 fois.
il existe différents types de quantificateurs :
Certains élèves peuvent se demander : que signifie l'attribut gourmand ici ?
gourmand signifie gourmand. Cet attribut indique si cette répétition est un match gourmand ou un match non gourmand.
Si vous ajoutez un ? après le quantificateur, vous constaterez que gourmand devient faux, ce qui signifie passer à une correspondance non gourmande :
Alors, que signifient gourmand et non gourmand ?
Voyons un exemple.
La correspondance de répétition par défaut est gourmande et continuera à correspondre tant que les conditions sont remplies, donc acbac peut être associé ici.
Ajoutez un ? après le quantificateur pour passer à non gourmand, et seul le premier sera mis en correspondance :
C'est une correspondance gourmande et une correspondance non gourmande. Grâce à AST, nous pouvons clairement savoir que gourmand et non gourmand. les non gourmands sont pour En termes de syntaxe répétitive, la valeur par défaut est la correspondance gourmande. Ajoutez un ? après le quantificateur pour passer à non gourmand.
L'expression régulière prend en charge le renvoi d'une partie de la chaîne correspondante dans un sous-groupe via ().
Regardez l'AST :
L'AST correspondante s'appelle Groupe.
Et vous constaterez qu'il a un attribut de capture, la valeur par défaut est vraie :
Qu'est-ce que cela signifie ?
C'est la syntaxe pour la capture de sous-groupes.
Si vous ne voulez pas capturer le sous-groupe, vous pouvez écrire (?:aaa) comme ça
Regardez, la capture est devenue fausse.
Quelle est la différence entre capture et non capture ?
Essayons :
Oh, il s'avère que l'attribut de capture de Group représente s'il faut extraire ou non.
Nous pouvons voir sur AST que capture est destiné aux sous-groupes. La valeur par défaut est capture, ce qui signifie que le contenu du sous-groupe est extrait. Vous pouvez passer en non-capture via ? : et le contenu du sous-groupe ne sera pas extrait.
Nous sommes déjà habitués à utiliser AST pour comprendre la syntaxe régulière, mais regardons quelque chose d'un peu plus difficile :
Les expressions régulières prennent en charge l'expression d'assertions anticipées via la syntaxe de (?= xxx) , utilisé pour déterminer si une certaine chaîne est précédée d'une certaine chaîne.
Vous pouvez voir à travers AST que cette syntaxe s'appelle Assertion, et que le type est lookahead, ce qui signifie regarder vers l'avant, ne correspondant qu'au sens précédent :
Qu'est-ce que cela signifie ? Pourquoi écris-tu ceci ? Quelle est la différence entre /bbb(ccc)/ et /bbb(?:ccc)/?
Essayons :
On peut le voir à partir des résultats :
/bbb(ccc)/ correspond au sous-groupe de ccc et extrait ce sous-groupe, car le sous-groupe par défaut est capturé.
/bbb(?:ccc)/ correspond au sous-groupe de ccc mais n'est pas extrait car nous avons passé ?: pour que le sous-groupe ne soit pas capturé.
/bbb(?=ccc)/ Le sous-groupe correspondant à ccc n'a pas été extrait, ce qui indique qu'il n'est pas non plus capturant. La différence entre cela et ? : est que ccc n'apparaît pas dans le résultat correspondant.
C'est la nature de l'assertion d'anticipation : L'assertion d'anticipation signifie qu'une certaine chaîne est précédée d'une certaine chaîne, que le sous-groupe correspondant n'est pas capturant et que la chaîne affirmée n'apparaîtra pas dans le résultat correspondant.
S'il n'est pas suivi de cette chaîne, il ne correspondra pas :
Changez ?= en ?! Ensuite, le sens change.
Bien que l'assertion d'anticipation soit toujours affirmée en premier, il existe un attribut négatif supplémentaire de vrai. Cette signification est très évidente. À l'origine, cela signifie que le devant est une certaine chaîne. Après négation, cela signifie que le devant n'est pas une certaine chaîne. Ensuite, le résultat de la correspondance est exactement le contraire : Maintenant, il ne correspondra que si la chaîne précédente n'est pas une certaine chaîne. Il s'agit d'une assertion anticipée négative.S'il y a une assertion précédente, il y aura naturellement une assertion finale, c'est-à-dire qu'elle ne correspondra que si elle est suivie d'une certaine chaîne.
De même, cela peut également être nié : L'AST correspondant à
(?
(?
L'assertion prospective et l'assertion prospective sont la syntaxe d'expression régulière la plus difficile à comprendre. N'est-elle pas beaucoup plus facile à comprendre si vous l'apprenez via. AST~
Les expressions régulières sont en cours de traitement. C'est un outil très pratique pour les chaînes, mais il est encore un peu difficile à apprendre. Beaucoup de gens sont confus au sujet de la syntaxe telle que la correspondance gourmande, la correspondance non gourmande, la capture de sous-groupes, la non-. capturer des sous-groupes, des assertions d'anticipation et des assertions d'anticipation.
Je recommande d'apprendre les règles régulières via AST. AST est une arborescence d'objets organisée selon la structure syntaxique. Diverses syntaxes peuvent être facilement clarifiées grâce aux noms et attributs des nœuds AST.
Par exemple, nous l'avons clarifié via AST :
La grammaire de répétition (Répétition) se présente sous la forme de caractère + quantificateur. La valeur par défaut est la correspondance gourmande (gourmand est vrai), ce qui signifie correspondance jusqu'à ce qu'il n'y ait pas de correspondance. après le quantificateur pour changer, cela devient une correspondance non gourmande et s'arrête lorsqu'un caractère correspond.
La syntaxe de sous-groupe (Groupe) est utilisée pour extraire une certaine chaîne. La valeur par défaut est la capture (la capture est vraie), ce qui signifie que l'extraction est requise. Vous pouvez passer à la non-capture via (?:xxx), qui correspond uniquement. mais n'extrait pas.
La syntaxe d'assertion (Assertion) représente qu'il y a une certaine chaîne avant ou après, qui est divisée en assertion anticipée et assertion lookbehind. La syntaxe est (?=xxx) et (?
Est-ce la compréhension approfondie de la syntaxe dans divers documents ou la compréhension approfondie de la syntaxe dans le compilateur ?
Pas besoin de demander, ça doit être le compilateur !
Ensuite, il est naturellement préférable d'apprendre la grammaire via l'arbre syntaxique qu'il analyse en fonction de la grammaire plutôt que du document.
Les expressions régulières sont comme ça, et d'autres apprentissages de grammaire sont également comme ça Si vous pouvez apprendre la grammaire en utilisant AST, vous n'avez pas besoin de lire la documentation.
Pour plus de connaissances sur les nœuds, veuillez visiter : tutoriel Nodejs !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!