SkRegExp 2.0 変更の詳細「同名グループ」

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

今回は「正規表現パターンの中に同じ名前のグループがあるときの挙動」の変更の詳細について説明します。

1.5 までは、番号の大きいグループから順に調べ、どれかがマッチしたらマッチ成功としていました。
2.0 からは、一番左側で定義されているグループを参照します。

例として次の正規表現パターンを取り上げます。

(?<n>a)(?<n>b)(?<n>c)k<n>

このパターンを abcc にマッチさせます。

  • 一番目のキャプチャバッファ <n> には a が格納されています。
  • 二番目のキャプチャバッファ <n> には b が格納されています。
  • 三番目のキャプチャバッファ <n> には c が格納されています。

1.5 の場合、k<n> は同名グループのいずれかとマッチすればマッチ成功です。

c とマッチするので全体のマッチは成功します。

2.0 の場合、k<n> は一番目のキャプチャバッファを参照します。

k<n> には a が格納されていて c とマッチしません。したがって全体のマッチは失敗します。

1.5 の仕様にした理由はそのような用途を私が必要としていたからです。

ただし、ずいぶん後になって Perl 5.10 のブランチリセットで同じことができることを知りました。

ブランチリセットは SkRegExp もサポートしています。

そのため 1.5 の仕様である必然性はなくなってしまいました。

それに、1.5 の仕様は同名グループのキャプチャバッファを探し回るのでオーバーヘッドも大きいです。

2.0 へのバージョンアップは良い機会なので仕様を Perl 互換に変更させてもらいました。

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

コメントを残す

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