var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr); // null
Я бы хотел, чтобы был поднят блок PRE, даже если он охватывает символы новой строки. Я думал, что флаг «м» делает это. Не.
Нашел ответ здесь перед публикацией. Так как я думал, что знаю JavaScript (прочитал три книги, работал часами), и в SO не было никакого решения, я все же осмелюсь опубликовать. бросать камни сюда
Итак, решение таково:
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr); // <pre>...</pre> :)
У кого-нибудь есть менее загадочный способ?
Изменить: это дубликат, но так как его сложнее найти, чем я, я не удаляю.
Это предлагается [^]
как "многострочная точка". Что я до сих пор не понимаю, так это почему [.\n]
не работает. Думаю, это одна из печальных частей JavaScript.
javascript
regex
akauppi
источник
источник
Ответы:
[.\n]
не работает, потому что.
не имеет особого значения внутри[]
, это просто означает буквальный.
.(.|\n)
будет способ указать «любой символ, включая перевод строки». Если вы хотите , чтобы соответствовать всем новым строкам, вам нужно будет добавить ,\r
а также включить Окна и классического Mac OS стиль завершение строк:(.|[\r\n])
.Это оказывается несколько громоздким, а также медленным (см. Подробности в ответе KrisWebDev ), поэтому лучшим подходом было бы сопоставить все пробельные символы и все непробельные символы с
[\s\S]
, что будет соответствовать всему, быстрее и проще.В общем, вы не должны пытаться использовать регулярное выражение для соответствия фактическим тегам HTML. См., Например, эти вопросы для получения дополнительной информации о том, почему.
Вместо этого попробуйте на самом деле найти в DOM нужный вам тег (использование jQuery делает это проще, но вы всегда можете сделать это
document.getElementsByTagName("pre")
со стандартным DOM), а затем выполнить поиск текстового содержимого этих результатов с помощью регулярного выражения, если вам нужно сопоставить его с содержимым. ,источник
[\r\n]
применяется к последовательности \ r \ n, сначала будет соответствовать \ r, а затем \ n. Если вы хотите сопоставить всю последовательность сразу, независимо от того, является ли эта последовательность \ r \ n или просто \ n, используйте шаблон.|\r?\n
[\s\S]+
..
внутри[]
, отличается от других сред регулярных выражений, в частности от продвинутого в .NET. Люди, пожалуйста, не думайте, что регулярные выражения являются кросс-платформенными, а зачастую и нет !!НЕ использовать
(.|[\r\n])
вместо.
многострочного сопоставления.DO использовать
[\s\S]
вместо.
для многострочного согласованияКроме того, избегайте жадности там, где это не нужно, используя
*?
или+?
квантификатор вместо*
или+
. Это может оказать огромное влияние на производительность.Посмотрите тест, который я сделал: http://jsperf.com/javascript-multiline-regexp-workarounds
NB: Вы также можете использовать,
[^]
но это не рекомендуется в комментариях ниже.источник
[^]
любом случае. С одной стороны, JavaScript - единственный известный мне вариант, который поддерживает эту идиому, и даже там он используется далеко не так часто, как[\s\S]
. С другой стороны, большинство других вкусов позволяют вам избежать]
, перечислив его первым. Другими словами, в JavaScript[^][^]
соответствует любым двум символам, но в .NET он соответствует любому один символ , отличный]
,[
или^
.\S
будет соответствовать\r
или\n
против какого-либо другого персонажа?[\s\S]
другим, как[\d\D]
или[\w\W]
?/<p>Can[^]*?<\/p>/
не соответствует тому же контенту, что и/<p>Can[^]*<\/p>/
. Жадный вариант должен быть изменен,/<p>(?:[^<]|<(?!\/p>))*<\/p>/
чтобы соответствовать тому же содержанию.Вы не указываете свою среду и версию Javascript (ECMAscript), и я понимаю, что этот пост был за 2009 год, но только для полноты, с выпуском ECMA2018 теперь мы можем использовать
s
флаг, чтобы вызвать.
совпадение с \ n, см. Https : //stackoverflow.com/a/36006948/141801Таким образом:
Это недавнее добавление, которое не будет работать во многих современных средах, например, Node v8.7.0, похоже, не распознает его, но работает в Chromium, и я использую его в тесте Typescript, который я пишу, и предположительно это со временем станет более популярным.
источник
[.\n]
не работает, потому что точка в[]
(по определению регулярного выражения; не только в javascript) означает символ точки. Вы можете использовать(.|\n)
(или(.|[\n\r])
) вместо этого.источник
[\s\S]
является наиболее распространенной идиомой JavaScript для сопоставления всего, включая переводы строк. Это проще для глаз и намного эффективнее, чем подход, основанный на чередовании(.|\n)
. (Это буквально означает «любой символ, который является пробелом или любой символ, который не является пробелом.).
и\n
, и почему[.\n]
не работает. Как уже упоминалось в вопросе,[^]
это также хороший подход.Я проверил его (Chrome), и он работает для меня (как
[^]
и[^\0]
), изменяя точку (.
) либо на,[^\0]
либо[^]
, потому что точка не соответствует разрыву строки (см. Здесь:http://www.regular-expressions.info/dot.html ).источник
[^\0]
том, что он не будет соответствовать нулевым символам, даже если в строках Javascript разрешены нулевые символы (см. Этот ответ ).Помимо вышеприведенных примеров, это альтернатива.
Где
\w
для слов и\s
для пробеловисточник