регулярное выражение соответствует всем тегам XML, которые содержат определенное значение атрибута - PullRequest
0 голосов
/ 30 января 2019

У меня есть XML-файл, в котором я хочу сопоставить все теги XML, которые содержат атрибут, соответствующий определенной строке в Perl.

Пример XML:

<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" />

При следующем регулярном выражении я сопоставляю все теги, а не только теги с атрибутом .htm:

<item.*?attr="[^>]*>

Есть ли какой-нибудь позитивный взгляд до определенного персонажа?

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Как предложил Гриннц, вы должны использовать approriate xml-parser (см. Этот интересный пост по stackoverflow , объясняющий почему), но, поскольку вы попросили его, вот простое регулярное выражение, которое вы можете использовать с положительным прогнозом:

<item.*?attr=".*(?=\.htm).*

Если вы хотите сопоставить теги только с одним «.htm», вы можете использовать как отрицательный, так и положительный взгляд:

^(?:(?!\.htm).)*\.htm(?!.*\.htm).*$

0 голосов
/ 30 января 2019

Подходящее решение Perl не является регулярным выражением.С 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...