Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何替换Perl正则表达式中的内容_Regex_Perl - Fatal编程技术网

Regex 如何替换Perl正则表达式中的内容

Regex 如何替换Perl正则表达式中的内容,regex,perl,Regex,Perl,我有一个字符串$text,想用正则表达式修改它。字符串包含多个部分,如John 我想搜索那些部分,通常我会用类似 $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

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

我想搜索那些部分,通常我会用类似

$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//

这在单个替换中是可能的,但它不必要地复杂。我建议您使用可执行替换进行两层替换


如果我理解正确的话,您想要做的只是“清理”标记内的文本(尽可能使用正则表达式“解析”XML)。这应该可以做到:

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

如果您有一个包含XML数据的变量,则必须使用适当的XML解析器(如或)对其进行处理。正则表达式不起作用。你可能认为他们会这样做,但是有一天你的数据会改变,你的程序会在你没有注意到的情况下失败。你忘了提到你想要替换的东西。
?我要替换的是介于和之间的任何内容。这是出现在整个字符串中的唯一一种标记,所以我不想使用大型XML机器。它输出原始字符串而不替换任何内容。。。另外,你能告诉我正则表达式中第一个和最后一个分组中的?=做什么吗?谢谢@user1769925:您是否阅读了我关于使用正则表达式处理XML的警告?那些是。模式匹配除尖括号
之外的任何字符序列,尖括号前面紧跟着
,后面紧跟着
。你试过自己运行我的第一段代码吗?你得到和我一样的结果了吗?哪种替代方法对你不起作用?谢谢你提供的信息,现在我了解了“向前看/向后看”;但代码实际上似乎并没有替代我机器上的任何东西,它只是输出$text不变;下面的解决方案,使用组来解决它,实际上对我很有用
<NAME>John^%</NAME>
$text =~ s{ (?<=<NAME>) ([^<>]*) (?=</NAME>) }{ $1 =~ s/\A\s+|\s+\z//gr =~ s/\A\W+//r }exg;
$text =~ s/(<NAME>)\s*\W*(.*?)\s*(<\/NAME>)/$1$2$3/sgi;