我正在处理来自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中测试了这个。
答案 0 :(得分:4)
这是known issue。
您可以在修改问题注释中提到的代码后重新编译单元。您所要做的就是将pas文件显式添加到项目中,以使编译器重新编译它,而不是使用随附的dcu。