Regex назвал группы захвата в Delphi XE

Я построил в RegexBuddy шаблон соответствия, который ведет себя именно так, как я ожидал. Но я не могу передать это в Delphi XE, по крайней мере, при использовании последних встроенных TRegEx или TPerlRegEx.

В моем реальном коде есть 6 групп захвата, но я могу проиллюстрировать проблему на более простом примере. Этот код дает "3" в первом диалоговом окне, а затем вызывает исключение (-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;

Но если я использую только одну группу захвата

Regex := TRegEx.Create('(?P<time>\d{1,2}:\d{1,2})');

В первом диалоговом окне отображается "2" и второй диалог покажет время «00:00», как и ожидалось.

Однако это было бы немного ограничивающим, если бы была разрешена только одна названная группа захвата, но это не так ... Если я изменю имя группы захвата на например «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;

I ' как и ожидалось, вы получите «3» и «00:00». Есть ли зарезервированные слова, которые я не могу использовать? Я так не думаю, потому что в моем реальном примере я пробовал совершенно случайные имена. Я просто не могу понять, что вызывает такое поведение.

8
задан Stefan Fjellsten 16 March 2011 в 10:36
поделиться