确定javascript正则表达式中有多少捕获组?
我正在开发一个将多个正则表达式合并为一个正则表达式的实用程序。我想支持replace with a函数,但这意味着需要为捕获组设置偏移量,以便将正确的参数传递给replace函数。以下是我找到的最简单的解决方案:确定javascript正则表达式中有多少捕获组?,javascript,regex,Javascript,Regex,我正在开发一个将多个正则表达式合并为一个正则表达式的实用程序。我想支持replace with a函数,但这意味着需要为捕获组设置偏移量,以便将正确的参数传递给replace函数。以下是我找到的最简单的解决方案: function countCapturingGroups(regexp) { var count = 0; regexp.source.replace(/(\\*)\((\?:)?/g, function(full, backslashes, nonCapturi
function countCapturingGroups(regexp) {
var count = 0;
regexp.source.replace(/(\\*)\((\?:)?/g,
function(full, backslashes, nonCapturing) {
if (backslashes.length % 2 === 0 && !nonCapturing) {
count++;
}
});
return count;
}
这支持:
/(?:this)/
-匹配字符类,如\[(?:\.\.[^\\]])*\]
[abc]
-匹配转义字符\\.
-匹配左括号,该括号既不是非捕获的,也不是向前看的(\()(?!\?)
- 可以安全地跳过任何其他正则表达式构造
-匹配字符类,如\[(?:\.\.[^\\]])*\]
[abc]
-匹配转义字符\\.
-匹配左括号,该括号既不是非捕获的,也不是向前看的(\()(?!\?)
- 可以安全地跳过任何其他正则表达式构造
/\(//
?它是一个转义的paren,非捕获,并且正则表达式有奇数个paren…paren并不总是平衡的…我只计算开始paren。countCapturingGroups(//\(/)//返回0
如果您试图解析的正则表达式只是/\(//
?这是一个转义的paren,非捕获,正则表达式有奇数个paren…paren不会总是平衡的…我只计算开始paren。countCapturingGroups(//\(//)//返回0
很好!不知怎的,我从来没有注意到所有非捕获构造都以(?
。这很有帮助。我正在编写一些测试用例以添加到问题中。@theazureshadow有进展吗?很好!不知怎的,我从未注意到所有非捕获构造都以(?
)开头的模式。这很有帮助。我正在编写一些测试用例以添加到问题中。@theazureshadow有进展吗?
function countCapturingGroups(regex) {
var count = 0;
regex.source.replace(/\[(?:\\.|[^\\\]])*\]|\\.|(\()(?!\?)/g,
function (full, capturing) {
if (capturing) count++;
});
return count;
}