【问题标题】:Unexpected result with TRegex matching a unicode string. Is this a bug?TRegex 匹配 unicode 字符串的意外结果。这是一个错误吗?
【发布时间】:2018-01-28 08:01:21
【问题描述】:

我使用的是delphi 10.1。 我在执行以下操作时得到了意想不到的结果

procedure TForm1.FormCreate(Sender: TObject);
var
  Match: TMatch;
  Regex: TRegex;
  Perl: TPerlRegEx;
const
  s1 = 'Réaitaei: test123';
  s2 = 'Réàààaitaei: test123';
  s3 = 'Réàààààààààaitaei: test123';
  pattern = '(.*): ';
begin
  Regex := TRegex.Create(pattern);
  Match := Regex.Match(s1);
  Assert(Match.Success);
  Memo1.Lines.Add(Match.Groups[1].Value);
  Match := Regex.Match(s2);
  Assert(Match.Success);
  Memo1.Lines.Add(Match.Groups[1].Value);
  Match := Regex.Match(s3);
  Assert(Match.Success);
  Memo1.Lines.Add(Match.Groups[1].Value);

  Perl := TPerlRegEx.Create;
  Perl.RegEx := pattern;
  Perl.Compile;
  Perl.Subject := s1;
  Assert(Perl.Match);
  Memo1.Lines.Add(Perl.Groups[1]);
  Perl.Subject := s2;
  Assert(Perl.Match);
  Memo1.Lines.Add(Perl.Groups[1]);
  Perl.Subject := s3;
  Assert(Perl.Match);
  Memo1.Lines.Add(Perl.Groups[1]);
end;

我明白了:

Réaitaei
Réàààaitaei:t
Réààààààààaaitaei:测试
雷亚泰伊
雷亚塔艾泰伊
雷亚塔亚阿亚泰伊

所以当文档说TRegex 只是TPerlRegex 的包装器时,TPerlRegex 有效,但 TRegex 无效。

我错过了什么还是一个错误?

我发现 Marco Cantu 的帖子说自从 delphi xe7 以来,delphi 使用 pcre 8.35,所以我不认为使用 unicode 会出现任何问题。

【问题讨论】:

  • 柏林也一样,但东京 10.2.1 有效。两者都会导致内存泄漏,您没有为 Perl 调用 Free。
  • 谢谢。我刚刚意识到我的标题不是一个问题,所以我要改写一下,以便有答案。如果您认为这绝对是一个错误,您可能希望将您的评论作为答案。
  • 不确定,但这在柏林有效: Assert(TRegex.Match('Réàààààààààaitaei: test123', '(.*): ').Groups[1].Value = 'Réààààààààaitaei');
  • 可能是这个RSP-15145
  • 泰。我安装了delphi tokyo starter,我的代码现在可以工作了,它确实与您指出的错误报告相同。甚至找到了另一个相关的RSP-17697

标签: regex debugging unicode pcre delphi-10.1-berlin


【解决方案1】:

看起来RSP-17697 在东京 10.2.1 中解决了这个问题。当您在相关单元上运行比较时,您可以看到 TBytes 已更改为 Unicode String。我已经检查了我重复使用的 RegEx 并且它没有受到影响,但对于任何不确定并使用柏林或更低版本的人,请使用类方法来确保所有工作:TRegex.Match('Réàààààààààaitaei: test123', '(.*): ').Groups[1].Value = 'Réàààààààààaitaei'

这将是一个要追捕的错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多