名前付きグループが使いやすくなりました【SkRegExp ver.2.6】

SkRegExp ではグループに名前を付けることができます。

グループに名前を付けるとどんな使い方できるのでしょうか?

次のように、名前で後方参照できます。

番号で参照するよりわかりやすいです。

<(?<tag>.*?)>.*?</k<tag>>

この例はHTMLタグのようなものに囲まれた文字列にマッチします。

また、プログラムの中で、グループを名前で参照できます。

var
  r: TSkRegExp;
begin
  r := TSkRegExp.Create;
  try
    r.Expression := '<(?.*?)>.*?>';
    if r.Exec('<p>初めまして世界</p>') then
    begin
      if r.Groups.Name['tag'].Strings = 'p' then
        ShowMessage('tag is "p"');
    end;
  finally
    r.Free;
  end;

同じことはグループ番号でもできます。

しかし、グループ番号はカッコの増減で番号が変わります。

正規表現パターンが変更されたときは番号も見直さなければなりません。

グループ名で参照すればこんな面倒はありません。

これほど便利な名前付きグループですが version 2.5 まではものすごく使いにくいモノでした。

たとえば (?<n>a)?b と言う正規表現パターンを b にマッチさせたとします。

var
  r: TSkRegExp;
begin
  r := TSkRegExp.Create;
  try
    r.Expression := '(?<n>a)?b';
    if r.Exec('b') then
    begin
      // version 2.5 以前ではココで例外が発生する
      if r.Groups.Name['n'].Strings = '' then
        ShowMessage(' is no null');
    end;
  finally
    r.Free;
  end;

このマッチは成功します。

しかし、version 2.5 以前では、グループ名 n を読み出すと例外が発生します。

なぜなら グループ名 n がマッチに参加していないからです。

version 2.5 以前では次のように書かなければなりませんでした。

var
  r: TSkRegExp;
begin
  r := TSkRegExp.Create;
  try
    r.Expression := '(?<n>a)?b';
    if r.Exec('b') then
    begin
      // version 2.5 以前ではグループ名 n のマッチをチェックしなければならない
      if (r.Groups.IndexOfMatchedName('n') <> -1) and
          (r.Groups.Name['n'].Strings = '') then
        ShowMessage(' is no null');
    end;
  finally
    r.Free;
  end;

ドキュメントでもちゃんと説明していないため、なおさら使いにくかったと思います。

version 2.6 からはもう IndexOfMatchedName を使う必要はありません。

      if r.Groups.Name['n'].Strings = '' then
        ShowMessage(' is no null');

マッチの状態に関わらず、グループ名が存在していれば例外は発生しなくなりました。

今後は積極的に名前付きグループを使って下さい。

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

コメントを残す

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