我有文字(有新行等),例如:
[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;
答案 0 :(得分:2)
由于您说这些代码无法嵌套,您可以使用正则表达式
\[my_tag\].*?\[\/my_tag\]
使用preSingleLine
标记使.
匹配换行符号。请参阅regex demo(演示网站上使用的s
选项。)
请注意,您可以安全地删除preMultiLine
,因为您的模式中没有^
和$
来重新定义行为。
或,您可以展开延迟点匹配模式以获得更好的效果:
\[my_tag\][^[]*(?:\[(?!\/my_tag\])[^[]*)*\[\/my_tag\]
见another regex demo。您不必使用preSingleLine
标志,因为否定字符类[^[]
也匹配换行符。