Я построил в 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». Есть ли зарезервированные слова, которые я не могу использовать? Я так не думаю, потому что в моем реальном примере я пробовал совершенно случайные имена. Я просто не могу понять, что вызывает такое поведение.