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

时间:2012-09-25 13:35:52

标签: javascript regex

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

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

将全部匹配成功。但是,例如,如果我在末尾添加一个额外的结束括号,它将不包括在匹配中。

(**)请不要回答通过解析(并计算括号)而不是使用正则表达式来做更容易的事情 - 在我抓了一会儿之后我已经知道了!

3 个答案:

答案 0 :(得分:5)

  

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

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

答案 1 :(得分:5)

这不是递归的,但它可以解决问题。

先决条件:

  • 函数名称是字母数字/下划线,可能有前导空格。
  • 函数名称不以数字开头。
  • 表达式中没有括号。
  • 只有一个表达式嵌套在函数中。

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];

正常表达式疾病:

\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
)

答案 2 :(得分:0)

值得注意的是,根据Bart Kiers的回答,一些正则表达式引擎(不包括Javascript)具有扩展功能以提供递归匹配 - 但是这样的功能不应该被认为是正式的表达式定义。