【发布时间】: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] <> '' 来捕捉这种情况,但我想知道我是否错过了任何正则表达式选项(或类似选项)来正确处理正则表达式的空字符串。我必须在 IsMatch 函数中显式使用空 RegexOptions,因为默认使用 roNotEmpty - 但这仅允许我的模式匹配零长度。
我在 Delphi 10.1 中对此进行了测试。
【问题讨论】:
-
虽然这是一个错误,但为什么要使用负前瞻而不是直接匹配模式呢?负前瞻可能代价高昂。
-
@J... 我的实际代码不再使用它,但我手头有它,它是重现此问题的第一个模式。
标签: regex delphi delphi-10.1-berlin