加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Regex在Delphi XE中命名了捕获组

发布时间:2020-12-15 03:55:27 所属栏目:大数据 来源:网络整理
导读:我在 RegexBuddy中构建了一个匹配模式,其行为完全符合我的预期.但我无法将其转移到Delphi XE,至少在使用最新的内置TRegEx或TPerlRegEx时. 我的真实世界代码有6个捕获组,但我可以用一个更简单的例子来说明问题.此代码在第一个对话框中显示“3”,然后在执行第
我在 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})');

第一个对话框显示“2”,第二个对话框将按预期显示时间“00:00”.

但是,如果只允许一个命名的捕获组,这将有点限制,但事实并非如此……如果我将捕获组名称更改为例如“atime”.

var
  Regex: TRegEx;
  M: TMatch;
begin
  Regex := TRegEx.Create('(?P<atime>d{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为每个具有k到z范围内第一个字母的名称返回PCRE_ERROR_NOSUBSTRING,该范围取决于判断中的第一个字母.将法官改为别的东西会改变范围.

我认为这里至少有两个漏洞.一个在pcre_get_stringnumber中,一个在TGroupCollection.GetItem中,需要引发一个正确的异常,而不是SRegExIndexOutOfBounds

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读