Я написал регулярное выражение для извлечения строки из HTML, но кажется, что многострочный флаг не работает.
Это мой шаблон, и я хочу получить текст в h1
теге.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
Я создал строку, чтобы проверить это. Когда строка содержит «\ n», результат всегда будет нулевым. Если я удалил все "\ n", это дало бы мне правильный результат, независимо от того, был или нет /m
флаг.
Что не так с моим регулярным выражением?
javascript
regex
Питер Мортенсен
источник
источник
dotAll
модификатор, так что вы можете сделать это,/.../s
и ваши точки также будут соответствовать новым строкам. По состоянию на июль 2017 года он стоит за флагом в Chrome.Ответы:
Вы ищете
/.../s
модификатор, также известный как модификатор dotall . Это заставляет точку.
также соответствовать символам новой строки, что по умолчанию не выполняется .Плохая новость заключается в том, что он
не существует в JavaScript(он существует на ES2018, см. Ниже) . Хорошей новостью является то, что вы можете обойти это, используя вместе класс символов (например\s
) и его отрицание (\S
), например так:Так что в вашем случае регулярное выражение станет:
На ES2018, JavaScript поддерживает
s
флаг (dotAll), так и в современных условиях регулярное выражение может быть , как вы написали, но сs
флагом в конце (а неm
;m
изменения , как^
и$
работа, не.
):источник
.
, но совпадение с пробелами тоже (\s
) означает, что оно совпадает\n
(что.
не выполняется в JavaScript или может быть связано сs
флагом).[^]
также работает, чтобы соответствовать любому символу, включая символы новой строки, в JavaScript. См. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*?
квантификатор вместо*
того, чтобы избежать жадности. Это позволит избежать перехвата последнего <h1> документа: это, вероятно, не то, что вам нужно, и это неэффективно, поскольку регулярное выражение будет продолжать искать <h1> до конца строки, даже если оно уже нашло его ранее.Вам нужен
s
модификатор (dotall), которого, очевидно, нет в Javascript - вы можете заменить его.
на [\ s \ S], как предложено @molf. Вm
(многострочных) модификаторы позволяет ^ и $ спичечных линий , а не вся строка.источник
s
флаг (ES2018). :-)[\s\S]
у меня не работало в nodejs 6.11.3. Основываясь на документации RegExp , он говорит, что использовать,[^]
который работает для меня.Например:
/This is on line 1[^]*?This is on line 3/m
где *? не жадный захват 0 или более вхождений [^].
источник
[^]
означает: это похоже на двойное отрицание: «соответствовать любому символу, которого нет в этом пустом списке», и поэтому все сводится к высказыванию «соответствует любому символу» .Модификатор dotall фактически превратил его в JavaScript в июне 2018 года, то есть ECMAScript 2018.
https://github.com/tc39/proposal-regexp-dotall-flag
источник
Мое предложение состоит в том, что лучше разбить многострочную строку на «\ n» и объединить разбиения исходной строки и стать одной строкой и легко манипулировать.
источник