正则表达式匹配包含特定属性值的所有xml标记

时间:2019-01-30 18:43:19

标签: regex xml perl

我有一个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" />

在确定角色之前是否存在某种积极的前瞻性?

谢谢

2 个答案:

答案 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).*$