@Shimpanze

Наткнулся на ошибочное поведение в регулярных выражениях?

Имеем строку:

<html><body><div>
<div>456</div>
<p>Привет, Мир!</p>
<div>456</div>
<p>Привет, Мир!</p>
</div></body></html>


Необходимо отсечь вот эту часть: div></body></html>

Регулярное выражение: '/div[\S\s]*?$/is'

Разбор регулярного выражения:

1. Устанавливаем флаги - регистронезависимый (i) и в одну строку (s) (так как искать будем с конца): /is

2. Найти любые символы, до первого (с конца) слова div: div[\S\s]*?$

...в итоге он выбирает всё до верхнего div... Почему? Ведь явное указание с не жадным оператором искать только до первого (с конца) div: div[\S\s]*?$
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
нет, поведение абсолютно правильное. "/s" говорит что перенос строк будет матчится как ".", потому регулярка успешно матчит все после первого дива

UPD: такое через negative lookahead достать можно
(\bdiv\b.*)(?!.*\1)$ (! без /s флага)

вернет нужное div></body></html>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы