Delphi TPerlRegEx替换所有2个字之间

时间:2016-05-05 10:53:52

标签: regex delphi

我有文字(有新行等),例如:

[my_tag]foo[/my_tag]
  bar baz [my_tag]bar 
foo[/my_tag] 
foo [my_tag]bar baz
foo[/my_tag] 

我想完全删除所有[my_tag][/my_tag]内容,例如:

[my_tag][/my_tag]
  bar baz [my_tag][/my_tag] 
foo [my_tag][/my_tag] 

我的代码不起作用(似乎与换行符不匹配):

var
  aPerlRegEx : TPerlRegEx;
  aContent   : string;
begin
  aContent := '';
  aContent := aContent + '[my_tag]foo[/my_tag]' + #13#10;
  aContent := aContent + 'bar baz [my_tag]bar ' + #13#10;
  aContent := aContent + 'foo[/my_tag] '        + #13#10;
  aContent := aContent + 'foo [my_tag]bar baz'  + #13#10;
  aContent := aContent + 'foo[/my_tag] '        + #13#10;

  aPerlRegEx := TPerlRegEx.Create;
  try
    with aPerlRegEx do begin
       Options     := [preCaseLess, preMultiLine];
       RegEx       := '\[my_tag\].*?\[\/my_tag\]';
       Subject     := aContent;
       Replacement := '';
    end;

    if aPerlRegEx.Match then
        aPerlRegEx.ReplaceAll;

    writeln(aPerlRegEx.Subject);
  finally
    FreeAndNil(aPerlRegEx);
  end;

1 个答案:

答案 0 :(得分:2)

由于您说这些代码无法嵌套,您可以使用正则表达式

\[my_tag\].*?\[\/my_tag\]

使用preSingleLine标记使.匹配换行符号。请参阅regex demo(演示网站上使用的s选项。)

请注意,您可以安全地删除preMultiLine,因为您的模式中没有^$来重新定义行为。

,您可以展开延迟点匹配模式以获得更好的效果:

\[my_tag\][^[]*(?:\[(?!\/my_tag\])[^[]*)*\[\/my_tag\]

another regex demo。您不必使用preSingleLine标志,因为否定字符类[^[]也匹配换行符。