Perl正则表达式问题,现在我没有头发[重复]

问题描述 投票:1回答:3

本质上,我试图修改符合条件的行上的每个标记。我有一个包含很多行的文件,该行可以有很多实例。每行可能匹配也可能不匹配。我要替换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的贪婪有关,但我不知道该如何解决。我已将所有头发拉出来,以尝试解决此问题。

我相信我还有一个使用split的替代方法(更多代码),但这很丑陋。

欢迎您提出意见或建议。

regex perl
3个回答
3
投票

Don't use regular expressions,您遇到的所有问题都是因为这种方法。 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;

2
投票

一个很好的正则表达式,可以找到房屋开/关标签并替换其内容与xxx:


0
投票

感谢所有提供建议和支持的人。我找到了似乎有效的解决方案,这是RegEx

© www.soinside.com 2019 - 2024. All rights reserved.