使用perl regex删除标记之间的字符串

时间:2013-10-28 16:41:21

标签: regex perl

给出一个像这样的输入字符串:

"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;

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

1 个答案:

答案 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>