Regex, чтобы найти элемент HTML без определенной фразы в его тегах - PullRequest
2 голосов
/ 05 мая 2011

Мне нужно сопоставить элементы <output_channels>, которые не содержат фразу "История" между открывающими <output_channels> и закрывающими </output_channels> тегами.<output_channels> элементы никогда не являются вложенными, поэтому я думаю, что я смогу сделать это с помощью регулярных выражений - пожалуйста, не отвечайте, что это невозможно, если это не так!

Вот пример текста, которым я будупоиск с использованием perl или vim (мне проще тестировать регулярные выражения в vim):

<output_channels>
  <output_channel>RSS</output_channel>
  <output_channel>Story</output_channel> 
</output_channels>

<output_channels>
  <output_channel>RSS</output_channel>
</output_channels>

Я думаю, мне нужно выполнить что-то вроде следующего, но это соответствует обоим <output_channels> блокам:

<output_channels>.*?((?!Story).)*?<\/output_channels>

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Использовать поисковый запрос:

<output_channels>\_s\{-}\(\(<output_channel>\_s\{-}Story\_s\{-}<\/output_channel>\)\@!\_.\)\{-}\_s\{-}<\/output_channels>

Это будет соответствовать вашему второму <output_channels> элементу только выше, так как он не имеет <output_channel>Story</output_channel>.

\_s будет соответствовать любому символу пробела, включая новую строку
\_. будет соответствовать любому символу, включая новую строку
{-} это сделать шаблон не жадный в vim
\@! отменяет предыдущее совпадение с шаблоном
\( и \) для группировки рисунка

2 голосов
/ 05 мая 2011

Может потребоваться некоторая корректировка в зависимости от того, как выглядит весь ваш XML-файл, но он работает с вашим примером:

<output_channels>(?:\s*<output_channel>(?!Story)[^<]+<\/output_channel>\s*)+<\/output_channels>
1 голос
/ 05 мая 2011

Вам нужно сначала избавиться от этого .*?.Происходит следующее: после того, как часть ((?!Story).)*? правильно не соответствует содержимому с Story, движок регулярных выражений возвращается и дает .*? трещину, и, конечно, это удается.Предполагая, конечно, что вы подходите в режиме /s (однострочный или точечный поиск всех).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...