SkRegExp 2.0 変更の詳細「再帰グループ内のキャプチャ」

SkRegExp verion 2.0 は仕様が変更になっています。

今回は「再帰グループ内のキャプチャ」の変更の詳細について説明します。

例として次の正規表現パターンを使います。

^(|.|(?:(.)(?1)k<2>))$

このパターンを reer にマッチさせると、version 1.5 まではマッチしませんが、version 2.0 はマッチします。

この違いは再帰パターン内のキャプチャバッファの扱いによるものです。

version 2.0.0 は再帰グループに入る毎に新しいキャプチャバッファが用意されます。

このパターンの場合、k<2> は同じレベルにある再帰パターンのキャプチャバッファを参照します。

  1. グループ2は1文字目の r をキャプチャバッファに格納します。
  2. 再帰に入ります。このとき、再帰グループ用に新しいキャプチャバッファが用意されます。
  3. 再帰グループ内でグループ2は2文字目の e をキャプチャバッファに格納します。
  4. k<2> は3文字目の e にマッチし、再帰を抜けます。
  5. 再帰グループ用のキャプチャは破棄され、元のキャプチャバッファを使用します。
  6. k<2> は4文字目の r がマッチします。元のキャプチャバッファを参照するからです。
  7. 以上でマッチは成功します。

version 1.5.x までは再帰グループがマッチしたら元のキャプチャバッファを更新していました。

そのため version 1.5.x では k<2> は再帰を抜けた時点で e が捕獲されています。したがってこのパターンはマッチしません。

正直言うと、なぜこのような仕様にしたのか思い出せませんが、version 2.0.0 の仕様の方が直感的だと思います。

SkRegExp version 2.0 はコチラでダウンロードできます。

コメントを残す

メールアドレスが公開されることはありません。