OUI
...en supposant qu'il existe un nombre maximum de nids auquel vous seriez heureux de vous arrêter.
Laissez-moi vous expliquer.
@torsten-marek a raison de dire qu'une expression régulière ne peut pas vérifier les motifs imbriqués comme celui-ci, MAIS il est possible de définir un modèle de regex imbriqué qui vous permettra de capturer des structures imbriquées comme ceci jusqu'à une certaine profondeur maximale . J'en ai créé un pour capturer Style EBNF commentaires ( Essayez-le ici ), comme :
(* This is a comment (* this is nested inside (* another level! *) hey *) yo *)
La regex (pour les commentaires à profondeur unique) est la suivante :
m{1} = \(+\*+(?:[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+
Vous pouvez facilement l'adapter à vos besoins en remplaçant l'option \(+\*+
y \*+\)+
con {
y }
et en remplaçant tout ce qui se trouve entre les deux par un simple [^{}]
:
p{1} = \{(?:[^{}])*\}
( Voici le lien pour essayer cela).
Pour imbriquer, il suffit de laisser ce motif dans le bloc lui-même :
p{2} = \{(?:(?:p{1})|(?:[^{}]))*\}
...or...
p{2} = \{(?:(?:\{(?:[^{}])*\})|(?:[^{}]))*\}
Pour trouver des blocs à triple encastrement, utilisez :
p{3} = \{(?:(?:p{2})|(?:[^{}]))*\}
...or...
p{3} = \{(?:(?:\{(?:(?:\{(?:[^{}])*\})|(?:[^{}]))*\})|(?:[^{}]))*\}
Un schéma clair est apparu. Pour trouver des commentaires imbriqués à une profondeur de N
il suffit d'utiliser l'expression rationnelle :
p{N} = \{(?:(?:p{N-1})|(?:[^{}]))*\}
where N > 1 and
p{1} = \{(?:[^{}])*\}
Un script pourrait être écrit pour générer récursivement ces regex, mais cela dépasse le cadre de ce dont j'ai besoin. (Ceci est laissé comme un exercice pour le lecteur.
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.