gpt4 book ai didi

Delphi XE 中的正则表达式命名捕获组

转载 作者:行者123 更新时间:2023-12-03 14:47:04 25 4
gpt4 key购买 nike

我在 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”。是否有我不能使用的保留字?我不这么认为,因为在我的真实示例中,我尝试了完全随机的名称。我只是无法弄清楚是什么导致了这种行为。

最佳答案

何时 pcre_get_stringnumber未找到名称,PCRE_ERROR_NOSUBSTRING已返回。

PCRE_ERROR_NOSUBSTRING在 RegularExpressionsAPI 中定义为 PCRE_ERROR_NOSUBSTRING = -7

一些测试表明 pcre_get_stringnumber返回PCRE_ERROR_NOSUBSTRING对于第一个字母在 k 范围内的每个名称至z该范围取决于 judge 中的第一个字母。改变judge其他的东西会改变范围。

据我所知,这里至少涉及两个错误。一中pcre_get_stringnumber TGroupCollection.GetItem 中的一个需要引发适当的异常,而不是 SRegExIndexOutOfBounds

关于Delphi XE 中的正则表达式命名捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com