Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定javascript正则表达式中有多少捕获组?_Javascript_Regex - Fatal编程技术网

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

确定javascript正则表达式中有多少捕获组?,javascript,regex,Javascript,Regex,我正在开发一个将多个正则表达式合并为一个正则表达式的实用程序。我想支持replace with a函数,但这意味着需要为捕获组设置偏移量,以便将正确的参数传递给replace函数。以下是我找到的最简单的解决方案: function countCapturingGroups(regexp) { var count = 0; regexp.source.replace(/(\\*)\((\?:)?/g, function(full, backslashes, nonCapturi

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

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;
    }