Comment faire correspondre les invocations de fonctions imbriquées (paires de brackets) à l'aide d'une expression régulière (récursive?)

Je recherche une expression régulière (**) qui correspond à un nombre inconnu de fonctions imbriquées. Alors

expression function(expression) function(function(expression)) function(function(function(expression))) etc. 

Tous correspondront avec succès. Mais, par exemple, si j'ajoute un support de fermeture supplémentaire à la fin, il ne serait pas inclus dans le match.

(**) Ne répondez pas que cela serait plus facile à faire en analysant (et en comptant des crochets) plutôt que d'utiliser une expression régulière – après avoir gratté ma tête pendant un certain temps, je le sais déjà!

Je recherche une expression régulière (**) qui correspond à un nombre inconnu de fonctions imbriquées.

Certaines implémentations regex prennent en charge la correspondance récursive (Perl, PHP, .NET), mais JavaScript ne l'est pas. Donc, la réponse à votre question est: non, ce n'est pas possible.

Ce n'est pas récursif, mais ça fait l'affaire.

PRECONDITIONS:

  • Les noms de fonctions sont alphanumériques / souligné avec des espaces blancs possibles.
  • Les noms de fonctions ne commencent pas avec un nombre.
  • Les expressions ne comportent aucune parenthèse.
  • Il n'y a qu'une seule expression imbriquée dans les fonctions.

CODE:

 var target = "function(function(function(expression)))"; var pattern = /\s*([a-zA-Z_]\w*[(](\s*[a-zA-Z_]\w*[(]|[^()]+[)]|[)])+[)])/; var matches = target.match(pattern); var target= matches[1]; 

DISSECTION D'EXPRESSION RÉGULIÈRE:

 \s* // 0+ white space characters ( // Capture group for what you want [a-zA-Z_] // 1 letter/underscore \w* // 0+ word characters (alpha-numeric/underscore) [(] // left parenthesis ( // PIECES: \s* // 0+ white space characters [a-zA-Z_] // 1 letter/underscore \w* // 0+ word characters (alpha-numeric/underscore) [(] // left parenthesis | // OR [^()]+ // 1+ non-parenthesis characters [)] // right parenthesis | // OR [)] // right parenthesis )+ // 1+ of these PIECES [)] // right parenthesis ) 

Les conseils à cet égard (c.-à-d. Ne pas tenter de faire correspondre les «paires», comme les parenthèses à l'aide d'expressions régulières) sont maintenant couverts dans la documentation de StackOverflow .

Il convient de noter, selon la réponse de Bart Kiers, que certains moteurs regex (à l'exclusion de Javascript) ont des fonctionnalités étendues pour fournir une correspondance récursive, mais une telle fonctionnalité ne doit pas être considérée comme une expression régulière selon la définition formelle.