确定javascript正则表达式中有多少个捕获组?

时间:2013-10-24 18:22:06

标签: javascript regex

我正在使用一个实用程序将多个正则表达式合并为一个。我想支持用函数替换,但这意味着我需要为捕获组设置一个偏移量,这样我就可以将正确的参数传递给replacer函数。这是我找到的最简单的解决方案:

function countCapturingGroups(regexp) {
  var count = 0;
  regexp.source.replace(/(\\*)\((\?:)?/g,
      function(full, backslashes, nonCapturing) {
    if (backslashes.length % 2 === 0 && !nonCapturing) {
      count++;
    }
  });
  return count;
}

这支持:

  1. 任意数量的反斜杠(偶数表示反斜杠本身已转义)
  2. 非捕获组,例如/(?:this)/
  3. 我是否忽略了使用无法捕获内容的括号的任何其他有效方法?

    您可以在此处看到它:http://jsfiddle.net/theazureshadow/RHdPP/

1 个答案:

答案 0 :(得分:1)

function countCapturingGroups(regex) {
    var count = 0;
    regex.source.replace(/\[(?:\\.|[^\\\]])*\]|\\.|(\()(?!\?)/g,
        function (full, capturing) {
            if (capturing) count++;
        });
    return count;
}
  • \[(?:\\.|[^\\\]])*\] - 匹配字符类,例如[abc]
  • \\. - 匹配转义的字符。
  • (\()(?!\?) - 匹配左括号,不是非捕获也不是前瞻。
  • 可以安全地跳过任何其他正则表达式构造。