var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr); // null
I'd want the PRE block be picked up, even though it spans over newline characters. I thought the 'm' flag does it. Does not.
Found the answer here before posting. SInce I thought I knew JavaScript (read three books, worked hours) and there wasn't an existing solution at SO, I'll dare to post anyways. throw stones here
So the solution is:
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr); // <pre>...</pre> :)
Does anyone have a less cryptic way?
Edit: this is a duplicate but since it's harder to find than mine, I don't remove.
It proposes [^]
as a "multiline dot". What I still don't understand is why [.\n]
does not work. Guess this is one of the sad parts of JavaScript..
This question is related to
javascript
regex
[\\w\\s]*
This one was beyond helpful for me, especially for matching multiple things that include new lines, every single other answer ended up just grouping all of the matches together.
You do not specify your environment and version of Javascript (ECMAscript), and I realise this post was from 2009, but just for completeness, with the release of ECMA2018 we can now use the s
flag to cause .
to match '\n', see https://stackoverflow.com/a/36006948/141801
Thus:
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
This is a recent addition and will not work in many current environments, for example Node v8.7.0 does not seem to recognise it, but it works in Chromium, and I'm using it in a Typescript test I'm writing and presumably it will become more mainstream as time goes by.
[.\n]
doesn't work, because dot in []
(by regex definition; not javascript only) means the dot-character. You can use (.|\n)
(or (.|[\n\r])
) instead.
Now there's the s (single line) modifier, that lets the dot matches new lines as well :) \s will also match new lines :D
Just add the s behind the slash
/<pre.*?<\/pre>/gms
In addition to above-said examples, it is an alternate.
^[\\w\\s]*$
Where \w
is for words and \s
is for white spaces
I have tested it (Chrome) and it working for me( both [^]
and [^\0]
), by changing the dot (.
) by either [^\0]
or [^]
, because dot doesn't match line break (See here: http://www.regular-expressions.info/dot.html).
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";_x000D_
var arr= ss.match( /<pre[^\0]*?<\/pre>/gm );_x000D_
alert(arr); //Working
_x000D_
DON'T use (.|[\r\n])
instead of .
for multiline matching.
DO use [\s\S]
instead of .
for multiline matching
Also, avoid greediness where not needed by using *?
or +?
quantifier instead of *
or +
. This can have a huge performance impact.
See the benchmark I have made: 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: You can also use [^]
but it is deprecated in the below comment.
Source: Stackoverflow.com