给出一个像这样的输入字符串:
"blah <b>abc <i>foo</i> GETME bar </b> GETME <b>something else</b>"
我想写一个PERL正则表达式,它产生一个结果字符串,如:
"blah <b>abc <i>foo</i> bar </b> GETME <b>something else</b>
<b>
和</b>
之间的“GETME”已被删除。基本上我想删除开始<b>
和结束</b>
标记之间的所有“GETME”实例。
我已经看到有一个“平衡”套餐可以解决这个问题,但似乎有点矫枉过正。有更简单的解决方案吗?
类似的东西:
$teststr =~ s/(<b>[^>]*?)GETME(.*?<\/b>)/$1$2/g;
只有在<i>
和<b>
之间没有</b>
之类的嵌套代码时才有效。
理想情况下,我可以写一些类似的东西:
$teststr =~ s/<b>(.*?)</b>/{$1 =~ s/GETME//g}/g;
我嵌套另一个正则表达式,但如果可能的话,我不知道语法。
答案 0 :(得分:5)
使用解析器,例如XML::Twig
:
#!/usr/bin/env perl;
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new(
twig_roots => {
'b' => sub {
$_->subs_text( qr{\bGETME\b}, '' );
$_->print;
},
},
twig_print_outside_roots => 1,
)->parse(
'<root>blah <b>abc <i>foo</i> GETME bar </b> GETME <b>something</b></root>'
);
它产生:
<root>blah <b>abc <i>foo</i> bar </b> GETME <b>something</b></root>