我有一个字符串$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//
?
答案 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;