Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 Regex统计Regex中捕获组的数量_Javascript_Regex - Fatal编程技术网

Javascript Regex统计Regex中捕获组的数量

Javascript Regex统计Regex中捕获组的数量,javascript,regex,Javascript,Regex,我需要一个正则表达式来检查任意正则表达式(作为字符串),返回捕获组的数量。到目前为止我已经 arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length 这适用于某些情况,假设任何以问号开头的组都是不可捕获的。它还统计空组 它不适用于字符类中包含的方括号或转义方括号,也可能不适用于其他情况。修改正则表达式,使其匹配空字符串,然后匹配空字符串并查看它返回的组数: var num_groups = (new RegExp(regex.toSt

我需要一个正则表达式来检查任意正则表达式(作为字符串),返回捕获组的数量。到目前为止我已经

arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length
这适用于某些情况,假设任何以问号开头的组都是不可捕获的。它还统计空组


它不适用于字符类中包含的方括号或转义方括号,也可能不适用于其他情况。

修改正则表达式,使其匹配空字符串,然后匹配空字符串并查看它返回的组数:

var num_groups = (new RegExp(regex.toString() + '|')).exec('').length - 1;

示例:

公认的答案是您应该在任何生产系统中使用的。但是,如果您想使用正则表达式来解决这个问题,您可以按如下所示的方式来完成。它假定您想要的组数的正则表达式是正确的

请注意,组的数量只是正则表达式中非文字的
s)的数量。我们将采取的策略不是匹配所有正确的
),而是将拆分为它们之间所有不正确的内容

re.toString().split(/(\(\?|\\\[|\[(?:\\\]|.)*?\]|\\\(|[^(])+/g).length - 1

你可以看到它是如何工作的。

有人能解释一下管道代表什么吗?管道代表交替,所以正则表达式a | b将匹配“a”或“b”。对于这个答案,它更像是
a |
,它将匹配“a”或空字符串(“”)。为什么
regex.toString()
?它包含斜杠,在新的正则表达式中不需要包含斜杠。我认为
regex.source
会更好一些。