我正在寻找一个正则表达式(**),它将匹配未知数量的嵌套函数。所以
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)具有扩展功能以提供递归匹配 - 但根据正式定义,这样的功能不应被视为正则表达式。