TRegex.Match 从不匹配空字符串

TRegex.Match never matches empty strings

我正在处理 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] <> '' 来捕获这种情况,但我想知道我是否错过了任何 Regex 选项(或类似选项)以使用 RegEx 正确处理空字符串。我必须在 IsMatch 函数中明确使用空的 RegexOptions,因为默认使用 roNotEmpty - 但这只允许我的模式匹配零长度。

我已经在 Delphi 10.1.

中测试过了

这是一个known issue

您可以按照问题评论中提到的修改代码后重新编译单元。您所要做的就是明确地将 pas 文件添加到您的项目中,以使编译器重新编译它,而不是使用附带的 dcu。