234 votes

Les expressions régulières peuvent-elles être utilisées pour faire correspondre des motifs imbriqués ?

Est-il possible d'écrire une expression régulière qui correspond à un motif imbriqué qui apparaît un nombre inconnu de fois ? Par exemple, une expression régulière peut-elle faire correspondre une accolade ouvrante et une accolade fermante lorsqu'il existe un nombre inconnu d'accolades ouvrantes/fermantes imbriquées dans les accolades extérieures ?

Par exemple :

public MyMethod()
{
  if (test)
  {
    // More { }
  }

  // More { }
} // End

Devrait correspondre :

{
  if (test)
  {
    // More { }
  }

  // More { }
}

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 sont context-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.

0voto

Marco Points 154

0voto

Steven Lu Points 8021

Mon question+réponse est lié et je fais une expression et une méta-expression qui peuvent correspondre à des niveaux arbitraires (finis) d'imbrication. C'est plutôt moche, mais à quoi d'autre peut-on s'attendre ? Utilisez les rétro-références dans la correspondance si votre moteur le supporte.

-3voto

Adam Rosenfield Points 176408

Non. Vous avez besoin d'un analyseur syntaxique complet pour ce type de problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X