RegexBuddy で、期待どおりに動作する一致パターンを作成しました。しかし、少なくとも組み込みの最新の TRegEx または TPerlRegEx を使用している場合、これを Delphi XE に転送することはできません。
私の実際のコードには 6 つのキャプチャ グループがありますが、より簡単な例で問題を説明できます。このコードは、最初のダイアログで "3" を返し、2 番目のダイアログの実行時に例外 (範囲外の -7 インデックス) を発生させます。
var
Regex: TRegEx;
M: TMatch;
begin
Regex := TRegEx.Create('(?P<time>\d{1,2}:\d{1,2})(?P<judge>.{1,3})');
M := Regex.Match('00:00 X1 90 55KENNY BENNY');
ShowMessage(IntToStr(M.Groups.Count));
ShowMessage(M.Groups['time'].Value);
end;
しかし、キャプチャ グループを 1 つだけ使用すると、
Regex := TRegEx.Create('(?P<time>\d{1,2}:\d{1,2})');
最初のダイアログには「2」が表示され、2 番目のダイアログには予想どおり時刻「00:00」が表示されます。
ただし、名前付きキャプチャ グループが 1 つしか許可されていない場合、これは少し制限されますが、そうではありません...たとえば、キャプチャ グループ名を「atime」に変更するとします。
var
Regex: TRegEx;
M: TMatch;
begin
Regex := TRegEx.Create('(?P<atime>\d{1,2}:\d{1,2})(?P<judge>.{1,3})');
M := Regex.Match('00:00 X1 90 55KENNY BENNY');
ShowMessage(IntToStr(M.Groups.Count));
ShowMessage(M.Groups['atime'].Value);
end;
予想どおり、「3」と「00:00」が表示されます。使えない予約語はありますか?私の実際の例では、完全にランダムな名前を試したので、そうは思いません。この動作の原因がわかりません。