我有类似(用新行等)的文本,例如:
[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/