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。
我正在处理 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。