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

#regex

#регулярное выражение

Вопрос:

Я пытаюсь захватить слова в ссылке, если они содержат определенное слово, в случае «политика».

Например:

<a href="https://website/wp-content/uploads/2020/08/Policy-October-2018.pdf" target="_blank" rel="noopener noreferrer">Nature Policy (pdf, 1.9MB)</a></p><p>

Я хочу захватить: Политика природы (pdf, 1.9МБ)

Мне удалось идеально захватить конечный бит, используя приведенное ниже регулярное выражение, но я не могу заставить его начинаться с первого символа>.

Мое регулярное выражение:

(?i)[^">]*bPolicyb. ?(?=<)

Ответ №1:

В идеале вы никогда не должны использовать регулярное выражение для разбора вложенного содержимого, такого как HTML. При этом, если ваш вводимый текст всегда будет содержать только один не вложенный тег привязки <a> , тогда должен работать следующий шаблон регулярных выражений:

 <a[^>] >([^<]*bPolicyb[^<]*)</a>
  

ДЕМОНСТРАЦИЯ

Этот шаблон работает путем захвата в первой группе захвата текстового содержимого внутри тега привязки при условии, что это текстовое содержимое содержит слово Policy .

Ответ №2:

Я считаю, что это работает:

 (?<=>). ?bPolicyb. ?(?=<)
  

Я изменил начало, чтобы использовать положительный просмотр назад ( (?<=>) ), который соответствует > а затем . ? , который вы уже используете после слова Policy .

Демонстрация: https://regex101.com/r/sWNphQ/2