本质上,我试图修改符合条件的行上的每个标记。我有一个包含很多行的文件,该行可以有很多实例。每行可能匹配也可能不匹配。我要替换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的替代方法(更多代码),但这很丑陋。
欢迎您提出意见或建议。
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;
一个很好的正则表达式,可以找到房屋开/关标签并替换其内容与xxx:
感谢所有提供建议和支持的人。我找到了似乎有效的解决方案,这是RegEx