Delphi多线正则表达式

时间:2017-11-16 14:17:53

标签: regex delphi

我在Delphi中有一些调用外部差异工具的非回归测试代码。然后我的代码加载差异结果,并应删除可接受的差异,例如比较结果中的日期。我尝试使用多行TRegEx.Replace进行此操作,但未找到匹配项...

https://regex101.com/r/QBZuws/2显示了我想出的模式和示例测试差异文件。我需要删除匹配的" pararaphs" 3行

这是我的代码:

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;

此外,在跟踪TRegEx.Replace到

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)

我很惊讶地看到调试器中每个换行符#$ D#$ A之前和之后的引号,但是他们看起来并不真实" ......还是他们?

2 个答案:

答案 0 :(得分:3)

由于您似乎遇到了各种换行符的问题,我建议您调整正则表达式以使用\R而不是\n来匹配Windows样式换行符(CR + LF)以及Unix风格的换行符(LF)。

答案 1 :(得分:-1)

好吧,我刚注意到正则表达式中的\ n仅匹配LF,而不是CR + LF,所以我添加了

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

在我的功能开始时,它现在好多了...... 有时写下问题有助于......