例如,
$ thisMessage包含:
<...>
<request attribs="true" text="this is a message" ...>text here too</request>
</...>
所需的输出应为
<...>
<request attribs="true" msg="this is a message" ...>text here too</request>
</...>
'&lt;'中包含的“文字”和'&gt;'必须更换,文字不在'&lt;' '&GT;'不应该被触及。
我写的正则表达式喜欢这个,
$thisMessage =~ s/(<[^>]*)(text)([^<]*>)/$1msg$3/gi;
这样可行,但有更好的方法吗?
- 编辑 - 是否可以从替换部件中消除1美元和3美元?
答案 0 :(得分:3)
看起来你想用XML做事。我发现XML::Twig对于这类事情要好得多,因为它已经知道如何添加,删除或更改属性。
答案 1 :(得分:1)
你可以假设你的“文本”后跟=和“,并且这样做:
$thisMessage =~ s/text="/msg="/gi;
编辑:此外,如果您真的只是替换XML属性名称,那么您可能会删除“i”标志,因为XML属性名称是区分大小写的。
编辑:另一个处理&lt;和&gt;:
$thisMessage =~ s/(?<=\<[^<>]+?)text\s*=(?=[^<>]+?>)/msg=/gi;
答案 2 :(得分:0)
此:
use strict;
use warnings;
my($in) = '<request attribs="true" text="this is a message" ...>text="here too"</request>';
$in =~ s{<[^>]+\Ktext="}{msg="}g;
print $in;
产生这个:
C:\Temp>perl stackoverflow.pl
<request attribs="true" msg="this is a message" ...>text="here too"</request>
C:\Temp>
\K
是关键 - 请参阅Perl的 perlre 页面。不确定何时引入\K
,因此您可能需要更高版本的perl;我使用的是perl 5.10.0