2017-11-16 8 views
-2

私はDelphiで外部差分ツールを呼び出す非回帰テストコードをいくつか持っています。次に、私のコードはdiff結果を読み込み、比較結果の日付などの許容可能な相違点を削除する必要があります。私はDelphi multiline regex

https://regex101.com/r/QBZuws/2は私が思いついたパターンとサンプルテストdiffファイルを示しています...複数行TRegEx.Replaceでこれをやろうとしているが、一致が見つかりませんでした。私は引用符を見て驚きました

ほかに
function FilterDiff(AText:string):string; 
var 
    LStr:string; 
    Regex: TRegEx; 
begin 
    // AText:=StringReplace(AText,#13+#10,'\n',[rfReplaceAll]); // doesn't help ... 
    LStr := '\d\d.\d\d.20\d\d \d\d:\d\d:\d\d'; // regex for date and time 
    LStr := '@@.*@@\n-'+LStr+'\n\+'+LStr; // regex for paragraphs to remove 
    Regex := TRegEx.Create(LStr, [roMultiLine]); 
    Result := Regex.Replace(AText,''); 
end; 

procedure TReportTest.NonRegression; 
var 
    LDiff : TStringList; 
    // others removed for clarity 
begin 
    // removed section code that call an external tool and produces diff.txt file 
    LDiff := TStringList.Create; 
    LDiff.LoadFromFile('diff.txt'); 
    Status(FilterDiff(LDiff.Text)); // show the diffs in DUnit GUI for now 
    LDiff.Free; 
end; 

System.RegularExpressionsAPI.pcre_exec($4D72A50,nil,'--- '#$D#$A'+++ '#$D#$A'@@ -86 +86 @@'#$D#$A'-16.11.2017 15:00:36'#$D#$A'+15.11.2017 10:47:58'#$D#$A'@@ -400 +400 @@'#$D#$A'-16.11.2017 15:00:36'#$D#$A'+15.11.2017 10:47:58'#$D#$A,132,0,1024,$7D56800,300) 
System.RegularExpressionsCore.TPerlRegEx.Match 
System.RegularExpressionsCore.TPerlRegEx.ReplaceAll 
System.RegularExpressions.TRegEx.Replace(???,???) 
TestReportAuto.FilterDiff('--- '#$D#$A'+++ '#$D#$A'@@ -86 +86 @@'#$D#$A'-16.11.2017 15:00:36'#$D#$A'+15.11.2017 10:47:58'#$D#$A'@@ -400 +400 @@'#$D#$A'-16.11.2017 15:00:36'#$D#$A'+15.11.2017 10:47:58'#$D#$A) 

までTRegEx.Replaceをトレースしながら:私は私のコードです。ここ3行

のマッチング「pararaphs」を削除する必要がありますデバッガの各改行#$ D#$ Aの前と後に "実際"のように見えません...またはそれらは何ですか?

+1

一重引用符 ''は文字列区切り文字です。実際の引用であるためにエスケープする必要があります。だから、あなたが見ることができるのはデリミタです。ドキュメンテーションはこれを明確にすべきです。私はそれをレビューすることをお勧めします。 –

+0

@DavidHeffernan:はい、今は大丈夫です。 #$ D#$ Aがこのように連結されているのを見て驚いた –

答えて

-1

まあ、私は正規表現で\ nは唯一のLFではなく、CR + LFにマッチし気づいたので、私は私の関数の先頭で

AText:=StringReplace(AText,#13+#10,#10,[rfReplaceAll]); // \n matches only LF ! 

を追加し、それが は時々書いて...今、多くの方が良いでしょう問題を解決するのに役立ちます...

2

さまざまな種類の改行に問題があるようですが、\nの代わりに\Rを使用するようにRegexを調整することをお勧めします。これにはWindowsスタイル改行(CR + LF) Unixスタイル改行(LF)。