2013-04-16 139 views
12

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

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

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

它不适用于包含在字符类中的括号,或括号中的括号以及可能的其他一些场景。

+6

正则表达式的正则表达式... [Yo dawg](http://memearchive.net/memerial.net/5615/yo-dawg-i-herd-you-like-regex.jpg) – Kninnug

回答

19

修改您正则表达式,这样它会匹配一个空字符串,然后匹配一个空字符串,看看它有多少组返回:

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

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

+0

辉煌的东西 - 我从来没有想过这样做! –

+0

+1可爱的想法,安德鲁。工作很好。 :) – zx81

+0

有人可以解释管道代表什么? – Albin

1

接受的答案是你应该什么用于任何生产系统。不过,如果你想用乐趣解决它,你可以做到这一点,如下所示。它假定你想要的正则表达式的组数是正确的。

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

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

你可以看到它是如何工作的www.debuggex.com