Regex: найдите те конкретные теги HTML, которые содержат эти слова (строки)

Aug 19 2020

У меня есть эти теги:

<span class="text_obisnuit2">* Not&#259;:</span>John Wells - <em>My Dreams</em>, Albatros Books, 1986.</p>

и этот:

<span class="text_obisnuit1">* Not&#259;:</span>Mariah Carey - <em>Lovers on the road</em>, BackStreet Books, 1965.</p>

Итак, я хочу найти те конкретные теги html, <span class="text_obisnuit2">которые содержат эти слова (строки): Albatrosи <em>и </em>(первая строка)

Ответы

4 Glorfindel Aug 19 2020 at 16:49

Это простой вариант, но он требует, чтобы "Альбатрос" располагался после <em>тега ( демонстрация ):

(<span class="text_obisnuit2">).*<em>.*<\/em>.*Albatros.*

Следующему не важно, в каком порядке они находятся ( демо ):

(<span class="text_obisnuit2">).*(<em>.*<\/em>.*Albatros.*|Albatros.*<em>.*<\/em>.*)

Вот еще один вариант, в котором цифры после text_obisnuitне имеют значения, а весь spanтег фиксируется как первая группа ( демонстрация ):

(<span class="text_obisnuit\d+">.*<\/span>).*(<em>.*<\/em>.*Albatros.*|Albatros.*<em>.*<\/em>.*)

Все регулярные выражения предполагают, что каждая запись находится в отдельной строке файла. Возможно, имеет смысл определять границы <p>и </p>в качестве границ, но для этого нам потребуется более крупный отрывок из входного файла.

4 Toto Aug 19 2020 at 17:01
  • Ctrl+F
  • Найти то, что: <span class="text_obisnuit2">(?=.*?<em>.*?</em>)(?=.*?\bAlbatros\b).*$
  • ПРОВЕРКА обтекать
  • ПРОВЕРИТЬ Регулярное выражение
  • НЕ ПРОВЕРИТЬ . matches newline
  • Find All in Current Document

Пояснение:

<span class="text_obisnuit2">   # literally
(?=                             # positive lookahead, make sure we have after:
.*?                           # 0 or more any character but newline, not greedy
<em>                          # literally open em tag
.*?                           # 0 or more any character but newline, not greedy
</em>                         # literally close em tag
)                               # end lookahead
(?=                             # positive lookahead, make sure we have after:
.*?                           # 0 or more any character but newline, not greedy
\bAlbatros\b                  # Albatros with word boundaries
)                               # end lookahead
.*                              # 0 or more any character but newline
$                               # end of line

Снимок экрана: