提问者:小点点

如何使用正则表达式(递归)匹配嵌套函数调用(括号对)


我正在寻找一个正则表达式(**),它将匹配未知数量的嵌套函数。所以

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

所有的比赛都会成功。但举例来说,如果我在末尾添加一个额外的结束括号,它将不会包含在比赛中。

(**)请不要回答通过解析(和计算括号)比使用正则表达式更容易做到这一点——在挠头一会儿后,我已经知道了!


共3个答案

匿名用户

我正在寻找一个正则表达式(**),它将匹配未知数量的嵌套函数。

一些正则表达式实现支持递归匹配(Perl, PHP,.NET),但JavaScript没有。所以,你问题的答案是:不,那是不可能的。

匿名用户

这不是递归的,但它确实有用。

  • 函数名为字母数字/下划线,可能带有前导空格
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];
\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
)

匿名用户

值得注意的是,根据巴特·基尔斯的回答,一些正则表达式引擎(不包括Javascript)具有提供递归匹配的扩展特性——但是根据正式定义,这样的特性不应该被视为正则表达式。