1

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

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)/

我是否忽略了使用不会捕获内容的括号的任何其他有效方法?

你可以在这里看到它的作用:http: //jsfiddle.net/theazureshadow/RHdPP/

4

1 回答 1

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