Как использовать JavaScript регулярное выражение на несколько строк?
var ss= "<pre>aaaanbbbnccc</pre>ddd";
var arr= ss.match( /<pre.*?</pre>/gm );
alert(arr); // null
Я бы хотел, чтобы предварительный блок был поднят, даже если он охватывает символы новой строки. Я думал, что флаг " м " делает это. Не.
нашел ответ здесь перед отправкой. Поскольку я думал, что знаю JavaScript (прочитал три книги, работал часами), и в SO не было существующего решения, я все равно осмелюсь опубликовать. здесь бросать камни
Итак, решение такое:
var ss= "<pre>aaaanbbbnccc</pre>ddd";
var arr= ss.match( /<pre[sS]*?</pre>/gm );
alert(arr); // <pre>...</pre> :)
у кого-нибудь есть менее загадочным путь?
Edit:этой это дубликат, но так как его труднее найти, чем мой, я не удаляю.
предлагает [^] как "многострочная точка". Что я до сих пор не понимаю, почему [.n] не работает. Думаю, это одна из печальных частей JavaScript..
6 ответов:
[.\n]не работает, потому что.не имеет особого значения внутри[], это просто означает, что буквальное..(.|\n)можно указать "любой символ, включая символ новой строки". Если вы хотите, чтобы соответствовать все строки, вам нужно добавить\rа также включить Windows и классический Mac OS стиль окончания строки:(.|[\r\n]).это оказывается несколько громоздким, а также медленным, (см. ответ Крисвебдева для деталей), так что лучше подходить было бы соответствовать всем пробелам и всем небелым символам, с
[\s\S], который будет соответствовать все, и быстрее и проще.в общем, вы не должны пытаться использовать регулярное выражение, чтобы соответствовать фактическим тегам HTML. Смотрите, например,этивопросы для получения дополнительной информации о том, почему.
вместо этого попробуйте на самом деле поиск DOM для тега вам нужно (с помощью jQuery делает это проще, но вы всегда можете сделать
document.getElementsByTagName("pre")С стандартный DOM), а затем выполните поиск текстового содержимого этих результатов с помощью регулярного выражения, если вам нужно сопоставить содержимое.
не использовать
(.|[\r\n])вместо.для многострочных соответствия.используйте
[\s\S]вместо.для многострочный режим поискакроме того, избегайте жадности там, где это не нужно, используя
*?или+?Квантор вместо*или+. Это может иметь огромное влияние на производительность.смотрите тест, который я сделал:http://jsperf.com/javascript-multiline-regexp-workarounds
Using [^]: fastest Using [\s\S]: 0.83% slower Using (.|\r|\n): 96% slower Using (.|[\r\n]): 96% slowerNB: вы также можете используйте
[^]но это устарело в приведенном ниже комментарии.
[.\n]не работает, потому что точка в[](по определению regex; не только javascript) означает точечный символ. Вы можете использовать(.|\n)(или ).
Я проверил его (Chrome) и он работает для меня( оба
[^]и[^]), меняя точку (.) либо[^]или[^], потому что точка не соответствует разрыву строки (см. здесь: http://www.regular-expressions.info/dot.html).var ss= "<pre>aaaa\nbbb\nccc</pre>ddd"; var arr= ss.match( /<pre[^]*?<\/pre>/gm ); alert(arr); //Working
вы не указываете свою среду и версию Javascript (ECMAscript), и я понимаю, что этот пост был с 2009 года, но только для полноты, с выпуском ECMA2018 мы теперь можем использовать
sфлаг, чтобы вызвать.чтобы соответствовать '\n', см. https://stackoverflow.com/a/36006948/141801таким образом:
let s = 'I am a string\nover several\nlines.'; console.log('String: "' + s + '".'); let r = /string.*several.*lines/s; // Note 's' modifier console.log('Match? ' + r.test(s); // 'test' returns trueэто недавнее дополнение и не будет работать во многих текущих средах, например узел v8.7. 0, похоже, не распознает его, но он работает в Chromium, и я использую его в тесте Typescript, который я пишу, и, по-видимому, со временем он станет более распространенным.
В дополнение к вышеуказанным примерам, это альтернативный вариант.
^[\w\s]*$здесь
\wна слова\sдля пробелы
Comments