我需要一个正则表达式来检查任意正则表达式(作为字符串),返回捕获组的数量。到目前为止,我有......
arbitrary_regex.toString().match(/\((|[^?].*?)\)/g).length
适用于某些情况,其中假设任何以问号开头的组都是非捕获的。它也算空组。
它不适用于字符类或转义括号中包含的括号,也可能适用于其他一些场景。
答案 0 :(得分:25)
修改你的正则表达式,使它匹配一个空字符串,然后匹配一个空字符串,看看它返回了多少个组:
var num_groups = (new RegExp(regex.toString() + '|')).exec('').length - 1;
答案 1 :(得分:2)
接受的答案是您应该在任何生产系统中使用的答案。但是,如果您想使用正则表达式来解决它,那么您可以执行此操作,如下所示。它假定您想要的正则表达式组是正确的。
请注意,组的数量只是正则表达式中非文字(
的数量。我们要采取的策略不是匹配所有正确的(
,而是对他们之间的所有错误内容进行拆分。
re.toString().split(/(\(\?|\\\[|\[(?:\\\]|.)*?\]|\\\(|[^(])+/g).length - 1
您可以在www.debuggex.com上查看其工作原理。