繁体   English   中英

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

[英]How can I make substitutions only on the parts of the string between < and > in 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>
</...>

包含在“ <”和“>”内的“文本”必须被替换,并且不应触摸不在“ <”,“>”内的文本。

我写的正则表达式就像这样,

$thisMessage =~ s/(<[^>]*)(text)([^<]*>)/$1msg$3/gi;

这可行,但是,有更好的方法吗?

-编辑-是否可以从替换部件中删除$ 1和$ 3?

看起来您想使用XML进行操作。 我发现XML :: Twig对于这种事情要好得多,因为它已经知道如何添加,删除或更改属性。

您可以假设您的“文本”后跟=和“,然后进行如下操作:

$thisMessage =~ s/text="/msg="/gi;

编辑 :另外,如果您真的只替换XML属性名称,那么您可能会删除“ i”标志,因为XML属性名称区分大小写。

编辑 :处理<和>的另一个版本:

$thisMessage =~ s/(?<=\<[^<>]+?)text\s*=(?=[^<>]+?>)/msg=/gi;

这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM