TRegex.Match永远不会匹配空字符串

时间:2016-11-29 13:45:43

标签: regex delphi delphi-10.1-berlin

我正在处理来自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正确处理空字符串的任何正则表达式选项(或类似)。我必须在IsMatch函数中明确使用空的RegexOptions,因为默认情况下使用roNotEmpty - 但这只允许我的模式匹配零长度。

我在Delphi 10.1中测试了这个。

1 个答案:

答案 0 :(得分:4)

这是known issue

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