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
会更好一些。