2013-04-16 189 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