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的一个可悲的部分。


当前回答

不要用(.|[\r\n])代替。用于多行匹配。

用[\s\ s]代替。对于多行匹配

此外,在不需要的地方使用*?还是+ ?量词代替*或+。这可能会对性能产生巨大影响。

看看我做的基准测试:https://jsben.ch/R4Hxu

Using [^]: fastest
Using [\s\S]: 0.83% slower
Using (.|\r|\n): 96% slower
Using (.|[\r\n]): 96% slower

注意:你也可以使用[^],但它在下面的评论中被弃用了。

其他回答

不要用(.|[\r\n])代替。用于多行匹配。

用[\s\ s]代替。对于多行匹配

此外,在不需要的地方使用*?还是+ ?量词代替*或+。这可能会对性能产生巨大影响。

看看我做的基准测试:https://jsben.ch/R4Hxu

Using [^]: fastest
Using [\s\S]: 0.83% slower
Using (.|\r|\n): 96% slower
Using (.|[\r\n]): 96% slower

注意:你也可以使用[^],但它在下面的评论中被弃用了。

我已经测试了它(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);/ /工作

(。不工作,因为。[]里面没有特殊的含义,它只是一个字面意思。(.|\n)是一种指定“任何字符,包括换行符”的方法。如果你想匹配所有换行符,你还需要添加\r来包括Windows和经典的Mac OS风格的行结束符:(.|[\r\n])。

结果是有点麻烦,以及缓慢,(详情见KrisWebDev的答案),所以一个更好的方法是匹配所有空白字符和所有非空白字符,与[\s\ s],这将匹配所有,而且更快和更简单。

一般来说,不应该尝试使用regexp来匹配实际的HTML标记。例如,请看这些问题,了解更多关于原因的信息。

相反,尝试实际在DOM中搜索所需的标记(使用jQuery可以简化此操作,但您总是可以使用标准DOM执行document.getElementsByTagName(“pre”)),然后如果需要匹配这些内容,则使用regexp搜索这些结果的文本内容。

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

只要在斜杠后面加上s

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

(。\n]无效,因为dot in[](由正则表达式定义;不仅仅是javascript)表示点字符。您可以使用(.|\n)(或(.|[\n\r]))代替。