我有一个xml文件,我想在其中匹配所有包含与Perl中的某个字符串匹配的属性的xml标记。
示例XML:
ResourceList
我想要一个正则表达式,它可以捕获所有具有包含“ .htm”属性的节点
<item attr="Car" />
<item attr="Apple_And_Pears.htm#123" />
<item attr="Paper" />
<item attr="Orange_And_Peach.htm#213" />
使用以下正则表达式,我将与所有标签匹配,而不是仅匹配具有.htm属性的标签:
<item attr="Orange_And_Peach.htm#213" />
<item attr="Apple_And_Pears.htm#123" />
在确定角色之前是否存在某种积极的前瞻性?
谢谢
答案 0 :(得分:5)
适当的Perl解决方案不是regex。含Mojo::DOM(的许多选项中的一个):
use strict;
use warnings;
use Mojo::DOM;
use File::Slurper 'read_text';
my $xml = read_text 'test.xml';
my $dom = Mojo::DOM->new->xml(1)->parse($xml);
my $tags = $dom->find('item[attr*=".htm"]');
print "$_\n" for @$tags;
答案 1 :(得分:1)
正如Grinnz所建议的那样,您应该使用适当的xml解析器(请查看stackoverflow上的这则有趣的文章来解释原因),但是由于您要这样做,因此这里有一个简单的正则表达式,可以使用积极的前瞻性:>
<item.*?attr=".*(?=\.htm).*
如果要匹配仅包含一个“ .htm”的标记,则可以使用否定和肯定的查找:
^(?:(?!\.htm).)*\.htm(?!.*\.htm).*$