我正在寻找一个匹配未知数量的嵌套函数的正则表达式 (**)。所以
expression
function(expression)
function(function(expression))
function(function(function(expression)))
etc.
都会匹配成功。但例如,如果我在末尾添加一个额外的右括号,它将不会包含在匹配中。
(**)请不要回答说通过解析(和计算括号)而不是使用正则表达式会更容易做到这一点 - 在我挠了一会儿之后,我已经知道了!
我正在寻找一个匹配未知数量的嵌套函数的正则表达式 (**)。所以
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
)
值得注意的是,根据 Bart Kiers 的回答,一些正则表达式引擎(不包括 Javascript)具有扩展功能以提供递归匹配 - 但根据正式定义,不应将此类功能视为正则表达式。