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

受け入れ答えは何をすべきですどの運用システムでも使用できます。しかし、あなたが正規表現を使って楽しくそれを解決したいのであれば、以下のようにすることができます。正規表現のグループ数が正しいことを前提としています。

グループの数は、正規表現の非リテラル(の数にすぎないことに注意してください。私たちが取る戦略は、すべて正しい(をマッチさせるのではなく、という2つの間にある間違ったものすべてに行きます。

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

www.debuggex.comでどのように動作するかを確認できます。

関連する問題