同名グループの挙動【SkRegExp ver.2.6】

SkRegExp version 2.6 になって同名グループの挙動が仕様通りになりました。

version 2.5 以前はバグのため仕様とは違う挙動になっていました。

では、同名グループの仕様とは?

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

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

そして、グループ名 n を参照します。

var
  r: TSkRegExp;
begin
  r := TSkRegExp.Create;
  try
    r.Expression := '(?<n>a)(?<n>b)(?<n>c)';
    if r.Exec('abc') then
    begin
      ShowMessage(r.Groups.Names['n'].Strings);
    end;
  finally
    r.Free;
  end;
end;

この例では a が表示されます。

なぜなら、同じ名前のグループが複数以上存在するときは、現在のマッチングで一番左のグループを参照するからです。

では次のような正規表現パターンはどうなるでしょうか?


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

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

var
  r: TSkRegExp;
begin
  r := TSkRegExp.Create;
  try
    r.Expression := '(?<n>a)|(?<n>b)|(?<n>c)';
    if r.Exec('c') then
    begin
      ShowMessage(r.Groups.Names['n'].Strings);
    end;
  finally
    r.Free;
  end;
end;

この例では c が表示されます。

このパターンは | で区切られているためすべてのグループ n が一番左側です。

この場合はマッチ(に参加)したグループを参照します。

同名グループの扱いは処理系によって異なります。

したがって、使う機会は限られると思います。

ただ、SkRegExp の同名グループは Perl と同じ仕様だと覚えておいて下さい。

SkRegExp version 2.6.1 はこちらからダウロードできます。

コメントを残す

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