Les expressions régulières ne peuvent pas identifier les structures récursives . C'est la limitation fondamentale.
Prenez JSON - c'est un format assez simple, mais comme un objet peut contenir d'autres objets en tant que valeurs membres (arbitrairement profondes), la syntaxe est récursive et ne peut pas être analysée par une expression régulière. D'autre part, CSV peut être analysé par regex'es puisqu'il ne contient aucune structure récursive.
En bref, les expressions régulières ne permettent pas au motif de se référer à lui-même. Vous ne pouvez pas dire: à ce stade de la syntaxe, associez à nouveau l'ensemble du modèle. En d'autres termes, les expressions régulières ne correspondent que de manière linéaire, elle ne contient pas de pile qui lui permettrait de garder une trace de la profondeur à laquelle se trouve un modèle imbriqué.
Notez que cela n’a rien à voir avec la complexité ou la complexité du format. Les expressions S sont vraiment très simples, mais ne peuvent pas être analysées avec une expression régulière. CSS2, en revanche, est un langage assez complexe, mais ne contient pas de structures récursives et peut donc être analysé avec une expression régulière. (Bien que cela ne soit pas vrai pour CSS3 en raison des expressions CSS, qui ont une syntaxe récursive.)
Ce n’est donc pas parce qu’il est laid, complexe ou sujet aux erreurs d’analyser HTML en utilisant uniquement regex. C'est que ce n'est tout simplement pas possible .
Si vous devez analyser un format contenant des structures récursives, vous devez au moins compléter l'utilisation d'expressions régulières avec une pile pour garder une trace du niveau des structures récursives. C'est typiquement comment un analyseur fonctionne. Les expressions régulières sont utilisées pour reconnaître les parties "linéaires", tandis que le code personnalisé en dehors de l'expression rationnelle est utilisé pour suivre les structures imbriquées.
Généralement, l'analyse de ce type est divisée en phases distinctes. La tokénisation est la première phase où les expressions régulières sont utilisées pour scinder l'entrée en une séquence de "jetons" tels que des mots, des signes de ponctuation, des crochets, etc. L'analyse est la phase suivante où ces jetons sont analysés dans une structure hiérarchique, un arbre de syntaxe.
Ainsi, lorsque vous entendrez que HTML ou C # ne peuvent pas être analysés par des expressions rationnelles, sachez que celles-ci font toujours partie intégrante des analyseurs. Vous ne pouvez pas analyser un tel langage en utilisant uniquement des expressions régulières et aucun code d'assistance.