1

複数の正規表現を 1 つにマージするユーティリティに取り組んでいます。関数で置換をサポートしたいのですが、それは、正しい引数を置換関数に渡すことができるように、キャプチャ グループのオフセットが必要であることを意味します。これが私が見つけた最も簡単な解決策です:

function countCapturingGroups(regexp) {
  var count = 0;
  regexp.source.replace(/(\\*)\((\?:)?/g,
      function(full, backslashes, nonCapturing) {
    if (backslashes.length % 2 === 0 && !nonCapturing) {
      count++;
    }
  });
  return count;
}

これは以下をサポートします。

  1. 任意の数のバックスラッシュ (偶数はバックスラッシュ自体がエスケープされることを意味します)
  2. 非キャプチャーグループ、例えば/(?:this)/

コンテンツをキャプチャしない括弧を使用する他の有効な方法を見落としていますか?

ここで動作を確認できます: http://jsfiddle.net/theazureshadow/RHdPP/

4

1 に答える 1

1
function countCapturingGroups(regex) {
    var count = 0;
    regex.source.replace(/\[(?:\\.|[^\\\]])*\]|\\.|(\()(?!\?)/g,
        function (full, capturing) {
            if (capturing) count++;
        });
    return count;
}
  • \[(?:\\.|[^\\\]])*\]— などの文字クラスに一致します[abc]
  • \\.— エスケープ文字に一致します。
  • (\()(?!\?)— 非キャプチャでも先読みでもない左括弧に一致します。
  • 他の正規表現構造は安全にスキップできます。
于 2013-10-29T15:16:00.510 に答える