给定一个这样的输入字符串:
"blah <b>abc <i>foo</i> GETME bar </b> GETME <b>something else</b>"
Run Code Online (Sandbox Code Playgroud)
我想写一个PERL正则表达式,产生一个结果字符串,如:
"blah <b>abc <i>foo</i> bar </b> GETME <b>something else</b>
Run Code Online (Sandbox Code Playgroud)
其中的"GETME" <b>,并</b>已被删除.基本上我想删除开始<b>和结束</b>标记之间的所有"GETME"实例.
我已经看到有一个"平衡"包来处理这个问题,但它似乎有点矫枉过正.有更简单的解决方案吗?
就像是:
$teststr =~ s/(<b>[^>]*?)GETME(.*?<\/b>)/$1$2/g;
Run Code Online (Sandbox Code Playgroud)
但是只有在没有嵌套标签的情况下才有效,但是<i>在<b>和之间</b>.
理想情况下我可以这样写:
$teststr =~ s/<b>(.*?)</b>/{$1 =~ s/GETME//g}/g;
Run Code Online (Sandbox Code Playgroud)
我嵌套另一个正则表达式,但如果这样的话可能,我不知道语法.
例如,使用解析器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>'
);
Run Code Online (Sandbox Code Playgroud)
它产生:
<root>blah <b>abc <i>foo</i> bar </b> GETME <b>something</b></root>
Run Code Online (Sandbox Code Playgroud)