【问题标题】:TRegex.Match never matches empty stringsTRegex.Match 从不​​匹配空字符串
【发布时间】:2016-11-29 13:45:43
【问题描述】:

我正在处理来自 TStringList 的多个字符串,并希望跳过一些与某个 RegEx 模式不匹配的行。因此我创建了^(?!\t\w+\t\w+) 的模式并尝试了

program P;
uses
  System.SysUtils, System.Classes, System.RegularExpressions;
var
  S: TStringList;
  I: Integer;
begin
  S := TStringList.Create;
  try
    //Test and empty string should be passed
    S.Add('Test'); S.Add(''); S.Add(#9'Hello'#9'world%%');
    I := 0;
    while ((I < S.Count - 1) and TRegex.IsMatch(S[I], '^(?!\t\w+\t\w+)', [])) do
      Inc(I);
    Writeln(IntToStr(I) + ': ' + S[I]);
    Readln;
  finally
    S.Free;
  end;
end.

令人惊讶的是,它打印了1:,因此与我的 StringList 中的空字符串匹配,尽管它应该匹配模式。我可以通过添加and S[I] &lt;&gt; '' 来捕捉这种情况,但我想知道我是否错过了任何正则表达式选项(或类似选项)来正确处理正则表达式的空字符串。我必须在 IsMatch 函数中显式使用空 RegexOptions,因为默认使用 roNotEmpty - 但这仅允许我的模式匹配零长度。

我在 Delphi 10.1 中对此进行了测试。

【问题讨论】:

  • 虽然这是一个错误,但为什么要使用负前瞻而不是直接匹配模式呢?负前瞻可能代价高昂。
  • @J... 我的实际代码不再使用它,但我手头有它,它是重现此问题的第一个模式。

标签: regex delphi delphi-10.1-berlin


【解决方案1】:

这是known issue。

您可以在修改问题的 cmets 中提到的代码后重新编译单元。您所要做的就是将 pas 文件显式添加到您的项目中,以使编译器重新编译它,而不是使用随附的 dcu。

【讨论】:

  • Google 只为旧 EDN(和零长度匹配问题)提供了结果 - 为问题和您的答案 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2011-05-20
  • 2015-05-04
  • 1970-01-01
相关资源
最近更新 更多