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

我想要PRE块被拾取,即使它跨越换行符。我以为'm'旗就行了。没有。

在发帖前在这里找到答案。因为我认为我了解JavaScript(读了三本书,工作了几个小时),而且在SO没有现成的解决方案,所以无论如何我都敢发帖。在这里扔石头

所以解决方案是:

var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr);     // <pre>...</pre> :)

谁有更简单的方法?

编辑:这是一个复制品,但因为它比我的更难找到,我没有删除。

它提出[^]作为“多行点”。我仍然不明白的是为什么…不工作。我猜这是JavaScript的一个可悲的部分。


当前回答

我已经测试了它(Chrome),它为我工作([^]和[^\0]),通过改变点(.)与[^\0]或[^],因为点不匹配换行符(见这里:http://www.regular-expressions.info/dot.html)。

Var ss= "<pre>aaaa\nbbb\nccc</pre>ddd"; Var arr= ss.match(/<pre[^\0]*?< \ / pre > /通用); 警报(arr);/ /工作

其他回答

现在有了s(单行)修饰符,它可以让点匹配新行:) \s也会匹配新的行:D

只要在斜杠后面加上s

 /<pre>.*?<\/pre>/gms

我已经测试了它(Chrome),它为我工作([^]和[^\0]),通过改变点(.)与[^\0]或[^],因为点不匹配换行符(见这里:http://www.regular-expressions.info/dot.html)。

Var ss= "<pre>aaaa\nbbb\nccc</pre>ddd"; Var arr= ss.match(/<pre[^\0]*?< \ / pre > /通用); 警报(arr);/ /工作

你没有指定你的环境和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

这是最近添加的,在目前的许多环境中都不能工作,例如Node v8.7.0似乎不能识别它,但它可以在Chromium中工作,我正在编写的Typescript测试中使用它,估计随着时间的推移,它会变得更加主流。

[\ \ s w] *

这个问题对我来说非常有帮助,特别是在匹配包含新行在内的多个内容时,每个其他答案最终都只是将所有匹配项分组在一起。

除了上述例子之外,它是另一种选择。

^[\\w\\s]*$

\w代表单词,\s代表空白