20

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

arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length

这适用于某些情况,其中假设任何以问号开头的组都是非捕获的。它还计算空组。

它不适用于字符类中包含的括号、转义括号以及可能的其他一些情况。

4

2 回答 2

32

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

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

示例:http: //jsfiddle.net/EEn6G/

于 2013-04-16T20:55:39.407 回答
4

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

请注意,组的数量只是(正则表达式中非文字的数量。我们将采取的策略不是匹配所有正确的(,而是将它们之间的所有不正确的东西分开

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

您可以在www.debuggex.com上查看它的工作原理。

于 2013-04-16T21:14:18.723 回答