我在 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;
正如预期的那样,我会得到“3”和“00:00”。有不能使用的保留字吗?我不这么认为,因为在我的真实示例中,我尝试了完全随机的名称。我只是无法弄清楚导致这种行为的原因。