我有类似(用新行等)的文本,例如:

[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;

最佳答案

由于您说这些标签不能嵌套,因此可以使用正则表达式

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


preSingleLine标志使.匹配换行符。请参见regex demo(在演示站点上使用s选项)。

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

或者,您可以展开惰性点匹配模式以获得更好的性能:

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


请参见another regex demo。然后,由于否定的字符类preSingleLine也匹配换行符,因此不必使用[^[]标志。

关于regex - Delphi TPerlRegEx ReplaceAll 2个字之间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37048716/

10-10 16:56