Многострочный флаг регулярного выражения Javascript не работает

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

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

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

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

что не так с моим регулярным выражением?

Ответ 1

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

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

[\s\S]

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

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

Ответ 2

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

Ответ 3

Модификатор dotall действительно может превратить его в JavaScript в ближайшее время. https://github.com/tc39/proposal-regexp-dotall-flag

Возможно, в ECMAScript 2018, увидев, что он находится на этапе 3 процесса TC39.

Ответ 4

[\s\S] не работал у меня в nodejs 6.11.3. Основываясь на документации RegExp, он говорит, что использует [^], который работает для меня.

(Точка, десятичная точка) соответствует любому одиночному символу, кроме строки терминаторы:\n,\r,\u2028 или \u2029.

Внутри набора символов точка теряет свое особое значение и соответствует буквальная точка.

Обратите внимание, что m многострочный флаг не изменяет поведение точки. Итак, чтобы сопоставить шаблон по нескольким строкам, набор символов [^] может быть (если вы не имеете в виду старую версию IE, конечно), это будет соответствует любому символу, включая символы новой строки.

Например:

/This is on line 1[^]*?This is on line 3/m

где *? является не-жадным захватом 0 или более вхождений [^].