我正在寻找一个正则表达式(**),它将匹配未知数量的嵌套函数。所以
expression
function(expression)
function(function(expression))
function(function(function(expression)))
etc.
所有的比赛都会成功。但举例来说,如果我在末尾添加一个额外的结束括号,它将不会包含在比赛中。
(**)请不要回答通过解析(和计算括号)比使用正则表达式更容易做到这一点——在挠头一会儿后,我已经知道了!
我正在寻找一个正则表达式(**),它将匹配未知数量的嵌套函数。
一些正则表达式实现支持递归匹配(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)具有提供递归匹配的扩展特性——但是根据正式定义,这样的特性不应该被视为正则表达式。