如何仅在字符串的<之间的部分上进行替换?和>在Perl?

时间:2009-09-24 09:27:38

标签: regex perl

例如,

$ 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美元?

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