Как использовать 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..

456   6  

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% slower

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

[.\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

    Ничего не найдено.