var ss= "<pre>aaaanbbbnccc</pre>ddd";
var arr= ss.match( /<pre.*?</pre>/gm );
alert(arr);     // null

Я бы хотел, чтобы был поднят блок PRE, даже если он охватывает символы новой строки. Я думал, что флаг «м» делает это. Не.

Нашел ответ говорится, что перед публикацией. Так как я думал, что знаю JavaScript (прочитал три книги, отработал часы), и в SO не было никакого решения, я осмелюсь публиковать в любом случае. бросать камни сюда

Итак, решение таково:

var ss= "<pre>aaaanbbbnccc</pre>ddd";
var arr= ss.match( /<pre[sS]*?</pre>/gm );
alert(arr);     // <pre>...</pre> :)

У кого-нибудь есть менее загадочный способ?

Мы только что выпустили this является дубликатом, но так как его сложнее найти, чем моего, я не удаляю.

Предлагается [^] как «многострочная точка». Я до сих пор не понимаю, почему [.n] не работает. Думаю, это одна из печальных частей JavaScript.

[.n] Не работает, потому что . не имеет особого значения внутри [], это просто означает, что литерал . Глядя на вывод (.|n) будет способом указать «любой символ, включая новую строку «. Если вы хотите сопоставить все новые строки, вам также нужно добавить r, чтобы включить окончания строк в Windows и классическом стиле Mac OS: (.|[rn]) Глядя на вывод

Это оказывается довольно громоздким и медленным (см. KrisWebDev отвечает за подробности ), поэтому лучшим подходом было бы сопоставить все пробельные символы и все непробельные символы с [sS], который будет соответствовать всему, и будет быстрее и проще.

В общем, вы не должны пытаться использовать регулярное выражение для соответствия фактические теги HTML. См., Например, эти вопросы для получения дополнительной информации о том, почему.

Вместо этого попробуйте на самом деле найти в DOM нужный вам тег (использование jQuery делает это проще, но вы всегда можете сделать document.getElementsByTagName("pre") со стандартным DOM), а затем выполнить поиск текстового содержимого этих результатов с помощью регулярного выражения, если вы нужно сопоставить с содержанием.

НЕ используйте (.|[rn]) вывод будет: . для многострочного сопоставления.

НЕ ИСПОЛЬЗУЙТЕ [sS] вывод будет: . для многострочного сопоставления

Кроме того, избегайте жадности там, где это не нужно, используя *? или ? квантификатор вместо * или . Это может оказать огромное влияние на производительность.

См. Тест, который я сделал: http://jsperf.com/javascript-multiline-regexp-workarounds

Using [^]: fastest
Using [sS]: 0.83% slower
Using (.|r|n): 96% slower
Using (.|[rn]): 96% slower

Примечание: вы также можете использовать [^], но в приведенном ниже комментарии это не рекомендуется.

[.n] не работает, потому что точка в [] (по определению регулярного выражения ;, а не только в javascript) означает символ точки. Вы можете использовать (.|n) (или (.|[nr])) вместо этого.

Вы не указываете свою среду и версию Javascript (ECMAscript), и я понимаю, что эта статья была написана в 2009 году, но для полноты, с выпуском ECMA2018 теперь мы можем использовать флаг s, чтобы вызвать . чтобы соответствовать ‘ n’, см. https://stackoverflow.com/a/36006948/141801

Таким образом:

let s = 'I am a stringnover severalnlines.';
console.log('String: "'   s   '".');

let r = /string.*several.*lines/s; // Note 's' modifier
console.log('Match? '   r.test(s); // 'test' returns true

Это недавнее добавление, которое не будет работать во многих современных средах, например, Node v8.7.0, похоже, не распознает его, но работает в Chromium, и я использую его в тесте Typescript, который я пишу. и, по-видимому, со временем оно станет более распространенным.

Я проверил его (Chrome), и он работает для меня (оба [^] и [^]) изменяя точку (.) либо [^] или [^], потому что точка не соответствует разрыву строки (см. здесь: http://www.regular-expressions.info/dot.html ).

var ss= "<pre>aaaanbbbnccc</pre>ddd";
var arr= ss.match( /<pre[^]*?</pre>/gm );
alert(arr);     //Working

В дополнение к вышеприведенным примерам, это альтернатива.

^[\w\s]*$

Как указывают @squint и @mekdev, вы получаете лучшая производительность, сначала создав функцию вне цикла, а затем связав результаты внутри цикла. w для слов и s для пробелов