複数の正規表現を 1 つにマージするユーティリティに取り組んでいます。関数で置換をサポートしたいのですが、それは、正しい引数を置換関数に渡すことができるように、キャプチャ グループのオフセットが必要であることを意味します。これが私が見つけた最も簡単な解決策です:
function countCapturingGroups(regexp) {
var count = 0;
regexp.source.replace(/(\\*)\((\?:)?/g,
function(full, backslashes, nonCapturing) {
if (backslashes.length % 2 === 0 && !nonCapturing) {
count++;
}
});
return count;
}
これは以下をサポートします。
- 任意の数のバックスラッシュ (偶数はバックスラッシュ自体がエスケープされることを意味します)
- 非キャプチャーグループ、例えば
/(?:this)/
コンテンツをキャプチャしない括弧を使用する他の有効な方法を見落としていますか?
ここで動作を確認できます: http://jsfiddle.net/theazureshadow/RHdPP/