如何在多行中使用JavaScript正则表达式?

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

我希望PRE块被拾取,即使它跨越换行符。 我以为这个“m”的标志就是这样做的。 才不是。

在发布前找到答案。 我以为自己知道JavaScript(读了三本书,工作了几个小时),现在还没有解决方案,反正我也敢发表。 在这里扔石头

所以解决办法是:

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

有没有人有一个更神秘的方式?

编辑: 这是一个重复,但因为它比我更难找到,我不删除。

它提出[^]为“多行点”。 我仍然不明白的是为什么[.\n]不起作用。 猜猜这是JavaScript的悲伤部分之一..

[.\n]不起作用,因为.[]没有特殊的含义,它只是一个文字.(.|\n)将是一种指定“任何字符,包括换行符”的方法。 如果要匹配所有换行符,则还需要添加\r以包含Windows和经典的Mac OS样式行结尾:( (.|[\r\n])

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

一般来说,您不应该尝试使用正则表达式来匹配实际的HTML标记。 例如,请参阅这些 问题以获取更多关于原因的信息。

相反,尝试实际搜索您需要的标记的DOM(使用jQuery使这更容易,但您可以始终使用标准DOM做document.getElementsByTagName("pre") ),然后用正则表达式搜索这些结果的文本内容如果你需要匹配的内容。

不要使用(.|[\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 

注意:您也可以使用[^]但在下面的评论中已弃用。

[.\n]不起作用,因为[]点(通过正则表达式定义;而不是只有JavaScript)意味着点字符。 您可以使用(.|\n) (或(.|[\n\r]) )。

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

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