JavaScript regex многострочный флаг не работает

Я записал regex для выборки строки от HTML, но кажется, что многострочный флаг не работает.

Это - мой шаблон, и я хочу вложить текст h1 тег.

var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];

Я создал строку для тестирования его. Когда строка содержит "\n", результат является всегда пустым. Если я удалил весь "\n" s, он дал мне правильный результат, неважно, с или без /m флаг.

Что случилось с моим regex?

258
задан Peter Mortensen 31 July 2019 в 06:21
поделиться

2 ответа

Вы ищете /.../s модификатор, также известен как модификатор dotall . Он заставляет точку . также для сопоставления символов новой строки, что не выполняет по умолчанию.

Плохая новость в том, что он не существует в JavaScript (он существует с ES2018, см. ниже) . Хорошая новость заключается в том, что вы можете обойти это, используя класс символов (например, \ s ) и его отрицание ( \ S ) вместе, например:

[\s\S]

Итак, в вашем если регулярное выражение будет выглядеть так:

/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i

Начиная с ES2018, JavaScript поддерживает флаг s (dotAll), поэтому в современной среде ваше регулярное выражение может быть таким, как вы его написали, но с s флаг в конце (вместо m ; m изменяет способ работы ^ и $ , а не ). ):

/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is
595
ответ дан 23 November 2019 в 02:39
поделиться

Вам нужен модификатор s (dotall), который явно не существует в Javascript - вы можете заменить . с [\ s \ S], как предлагает @molf. Модификатор m (многострочный) заставляет совпадать строки ^ и $, а не всю строку.

20
ответ дан 23 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: