2016-11-29 2 views
3

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でテストしました。

+1

これはバグですが、パターンを直接照合するのではなく、ネガティブルックアヘッドを使用するのはなぜですか?ネガティブな先読みは高価になる可能性があります。 –

+0

@J ...私の実際のコードはもう使用しませんが、私が手元に持っていたので、この問題を再現する最初のパターンでした。 –

答えて

4

known issueです。

問題のコメントに記載されているコードを修正した後、ユニットを再コンパイルすることができます。プロジェクトにpasファイルを明示的に追加して、出荷されたdcuを使用せずにコンパイラに再コンパイルするだけで済みます。

+0

Googleは古いEDN(および長さゼロのマッチの問題)の結果を出しただけです。問題とあなたの答え+1。 –

関連する問題