3

给定这样的输入字符串:

"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>其中和之间的“GETME”</b>已被删除。基本上我想删除开始<b>和结束</b>标签之间的所有“GETME”实例。

我已经看到有一个“平衡”包可以解决这个问题,但它似乎有点矫枉过正。有更简单的解决方案吗?

就像是:

$teststr =~ s/(<b>[^>]*?)GETME(.*?<\/b>)/$1$2/g;

<i>有效,但前提是在<b>and之间没有像 a 这样的嵌套标签</b>

理想情况下,我可以写如下内容:

$teststr =~ s/<b>(.*?)</b>/{$1 =~ s/GETME//g}/g;

我在其中嵌套了另一个正则表达式,但如果可能的话,我不知道语法。

4

1 回答 1

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>
于 2013-10-28T16:50:58.820 回答