Многострочный флаг регулярного выражения 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 или более вхождений [^].