我需要一个检查任意正则表达式(作为字符串)的正则表达式,返回捕获组的数量。到目前为止,我已经...
arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length
这适用于某些情况,其中假设任何以问号开头的组都是非捕获的。它还计算空组。
它不适用于字符类中包含的括号、转义括号以及可能的其他一些情况。
我需要一个检查任意正则表达式(作为字符串)的正则表达式,返回捕获组的数量。到目前为止,我已经...
arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length
这适用于某些情况,其中假设任何以问号开头的组都是非捕获的。它还计算空组。
它不适用于字符类中包含的括号、转义括号以及可能的其他一些情况。
修改您的正则表达式,使其匹配一个空字符串,然后匹配一个空字符串并查看它返回多少组:
var num_groups = (new RegExp(regex.toString() + '|')).exec('').length - 1;
示例:http: //jsfiddle.net/EEn6G/
公认的答案是您应该在任何生产系统中使用的答案。但是,如果您想使用正则表达式来解决这个问题,您可以如下所示进行。它假设您想要组数的正则表达式是正确的。
请注意,组的数量只是(
正则表达式中非文字的数量。我们将采取的策略不是匹配所有正确的(
,而是将它们之间的所有不正确的东西分开。
re.toString().split(/(\(\?|\\\[|\[(?:\\\]|.)*?\]|\\\(|[^(])+/g).length - 1
您可以在www.debuggex.com上查看它的工作原理。