我正在使用一个实用程序将多个正则表达式合并为一个。我想支持用函数替换,但这意味着我需要为捕获组设置一个偏移量,这样我就可以将正确的参数传递给replacer函数。这是我找到的最简单的解决方案:
function countCapturingGroups(regexp) {
var count = 0;
regexp.source.replace(/(\\*)\((\?:)?/g,
function(full, backslashes, nonCapturing) {
if (backslashes.length % 2 === 0 && !nonCapturing) {
count++;
}
});
return count;
}
这支持:
/(?:this)/
我是否忽略了使用无法捕获内容的括号的任何其他有效方法?
答案 0 :(得分:1)
function countCapturingGroups(regex) {
var count = 0;
regex.source.replace(/\[(?:\\.|[^\\\]])*\]|\\.|(\()(?!\?)/g,
function (full, capturing) {
if (capturing) count++;
});
return count;
}
\[(?:\\.|[^\\\]])*\]
- 匹配字符类,例如[abc]
。\\.
- 匹配转义的字符。(\()(?!\?)
- 匹配左括号,不是非捕获也不是前瞻。