如何替换Perl正则表达式中的东西

时间:2014-11-21 19:02:40

标签: regex perl

我有一个字符串$text,想要用正则表达式修改它。该字符串包含多个部分,如<NAME>John</NAME>

我想搜索那些我通常会用

这样的部分
$text =~ m/<NAME>(.*?)<\/NAME>/g

然后确保没有前导空格和尾随空格,也没有前导非单词字符,我通常会用

来确保
$temp =~ s/^\s+|\s+$//g; # trim leading and trailing whitespaces
$temp = s/^\W*//g; # remove all leading non-word chars

现在我的问题是:我如何实现这一目标?是否可以使用s///正则表达式而不是m//

2 个答案:

答案 0 :(得分:1)

这可以在一次替换中实现,但它不必要地复杂化。我建议你使用可执行文件替换进行双层替换。

my $text = '<NAME>   %^John^%

</NAME>';

$text =~ s{ (?<=<NAME>) ([^<>]*) (?=</NAME>) }{
  (my $new = $1) =~ s/\A\s+|\s+\z//g;
  $new =~ s/\A\W+//;
  $new;
}eg;

print $text;

<强>输出

<NAME>John^%</NAME>

如果你有Perl 5的14或更高版本,并希望使用非破坏性/r修饰符)替换模式,这就更简单了。

$text =~ s{ (?<=<NAME>) ([^<>]*) (?=</NAME>) }{ $1 =~ s/\A\s+|\s+\z//gr =~ s/\A\W+//r }exg;

答案 1 :(得分:0)

如果我理解正确,你想要做的只是“清理”标签内的文本(只要可以使用正则表达式“解析”XML)。这应该可以解决问题:

$text =~ s/(<NAME>)\s*\W*(.*?)\s*(<\/NAME>)/$1$2$3/sgi;
相关问题