Non. C'est aussi simple que ça. Un automate fini (qui est la structure de données sous-jacente à une expression régulière) n'a pas de mémoire en dehors de l'état dans lequel il se trouve, et si vous avez une imbrication arbitrairement profonde, vous avez besoin d'un automate arbitrairement grand, ce qui entre en collision avec la notion de finie automate.
Vous pouvez faire correspondre des éléments imbriqués/appariés jusqu'à une profondeur fixe, la profondeur n'étant limitée que par votre mémoire, car l'automate devient très grand. En pratique, cependant, vous devriez utiliser un automate push-down, c'est-à-dire un analyseur syntaxique pour une grammaire sans contexte, par exemple LL (top-down) ou LR (bottom-up). Vous devez prendre en compte le plus mauvais comportement à l'exécution : O(n^3) vs. O(n), avec n = longueur(entrée).
Il existe de nombreux générateurs d'analyseurs disponibles, par exemple ANTLR pour Java. Il n'est pas non plus difficile de trouver une grammaire existante pour Java (ou C).
Pour plus d'informations : Théorie des automates à Wikipedia
28 votes
Pour répondre sans ambiguïté à cette question, il faut d'abord définir le terme : "expression régulière".
5 votes
Dans les livres, expressions régulières ne peut pas le faire, mais expressions sans contexte peut. À partir des outils, les analyseurs d'expression modernes appellent
regular expression
quelque chose qui utilise une pile externe, c'est-à-dire qui est capable de revenir en arrière, qui est capable de faire des recherches : ce sontcontext-free expressions
dans la pratique et vous pouvez donc le faire en une seule ligne avec des simili- PCRE2 (PHP, Java, .NET, Perl, ...) ou UNITÉ DE SOINS INTENSIFS -(Obj-C/Swift), souvent avec l'aide de l'outil d'analyse de l'environnement.(?>...)
ou des alternatives telles que la syntaxe(?R)
o(?0)
syntaxes.