如何在多行中使用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