Совпадение всего, многострочный шаблон, несколько раз, но не если совпадение содержит строку - PullRequest
0 голосов
/ 27 марта 2019

Представьте, что у меня есть этот текст (я понимаю, что использование регулярных выражений для анализа HTML не является правильным решением ...)

 <div><p>HELLO1</p>
 <span>SPIDER</span></div>
 <div><p>HELLO2</p>
 <span>CHEESE</span></div>
 <div><p>HELLO3</p>
 <span>BANANA</span></div>

Я хочу сопоставить текст внутри <p> и <span> соответственно (это надуманный пример)

Я могу добиться этого, используя:

/<p>(.*?)<\/p>.*?<span>(.*?)<\/span>.*?<\/div>/gsmi

Однако я не хочу совпадать, если текст внутри диапазонаCHEESE.Я пытался использовать отрицательный взгляд, например, так:

/<p>(.*?)<\/p>.*?<span>((?!CHEESE).*?)<\/span>.*?<\/div>/gsmi

Однако теперь это не то, что соответствует шаблону HELLO2 и BANANA, где я хочу HELLO3 и BANANA

Я понимаю, что это потому, что я использую .*?, но это требуется для реального решения.

Пример здесь: https://regex101.com/r/h4YgDm/3

КакМогу ли я сопоставить только весь шаблон, но все еще охватывающий несколько строк?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Мой коллега прислал мне ответ, который делает то, что я хочу:

https://regex101.com/r/h4YgDm/8

Регулярное выражение: (?:(?:<div><p>(\w*)<\/p>\s)(?!<span>CHEESE<\/span>)(?:<span>(\w*)<\/span>)<\/div>)

0 голосов
/ 27 марта 2019

Вы можете достичь желаемого за два шага.Во-первых, извлеките элементы div, которые соответствуют критериям (т. Е. Нет СЫРА), как это ( demo ):

<div>(?:(?!CHEESE).)*?<\/div>

Во-вторых, выберите содержимое между p и span тегов как две группы ( демо ):

(?<=<p>)(.*?)(?=<\/p>)(?:.*?)(?<=<span>)(.*?)(?=<\/span>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...