TStringListからいくつかの文字列を処理していて、特定のRegExパターンと一致しない行をスキップしたいとします。したがって、私は^(?!\t\w+\t\w+)
のパターンを作成し、TRegex.Matchは空の文字列と決して一致しません
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.
驚くべきことに、それがパターンと一致する必要がありますけれども、私のSTRINGLISTから空の文字列にマッチするよう1:
を出力を実行しようとしました。私はand S[I] <> ''
を追加してこのケースをキャッチすることができますが、RegExで空の文字列を正しく処理するためにRegexオプション(または同様のもの)が欠けていたのかと思います。私は、デフォルトでroNotEmpty
が使用されているので、IsMatch関数で空のRegexOptionsを明示的に使用しなければなりませんでしたが、これはパターンの長さがゼロになるようにするだけです。
私はこれをDelphi 10.1でテストしました。
これはバグですが、パターンを直接照合するのではなく、ネガティブルックアヘッドを使用するのはなぜですか?ネガティブな先読みは高価になる可能性があります。 –
@J ...私の実際のコードはもう使用しませんが、私が手元に持っていたので、この問題を再現する最初のパターンでした。 –