首页 > 解决方案 > Perl 正则表达式问题,现在我没有头发

问题描述

本质上,我正在尝试修改与标准匹配的行上的每个标记。我有一个包含很多行的文件,并且该行可以有很多实例。每行可能匹配也可能不匹配。我想替换 ar XML 值,例如

<ns0:house>indifferent token</ns0:house> --> <ns0:house>xxx</ns0:house>
the token indifferent token will be replaced with xxx

不能保证 XML 已完成(可能是片段)...

这是我所拥有的

 $output =~ s/(<.+house>)(.*)(\/.+house>)/$1xxx$3/g

我会将其理解为全局替换和之间的所有字符(我简化了 XMl 元素(但 .+ 应该考虑任何任意命名空间)。

结果字符串只替换了一些匹配项。从逻辑上讲,我知道这与 REGEX 贪婪有关,但我不知道如何解决它。我已经把我所有的头发都拔了出来,试图解决这个问题。

我相信我有一个使用拆分的替代方案(更多代码),但这很难看。

欢迎提出想法或建议。

标签: regexperl

解决方案


不要使用正则表达式,你所有的问题都是因为这种方法。XML 解析器有多种选择,以下是使用Mojo::DOM的方法:

use strict;
use warnings;
use Mojo::DOM;

my $data = q{<ns0:house>indifferent token</ns0:house>};
my $dom = Mojo::DOM->new->xml(1)->parse($data);
foreach my $tag ($dom->find('house')->each) {
  $tag->content('xxx'); # this should already be XML-escaped if needed
}
print $dom;

推荐阅读