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

时间:2009-12-30 12:13:41

标签: javascript regex

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

我想要接收PRE块,即使它跨越换行符。我以为'米'旗就是这么做的。没有。

发布前找到答案here。我以为我认识JavaScript(读了三本书,工作了几个小时),而现在没有现成的解决方案,我敢于发布。 扔石头

所以解决方案是:

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

有没有人有一种不那么神秘的方式?

编辑:this是重复的,但由于它比我的更难找到,我不会删除。

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

8 个答案:

答案 0 :(得分:302)

请勿使用(.|[\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

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

答案 1 :(得分:203)

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

事实证明这有点麻烦,也很慢(参见KrisWebDev's answer for details),所以更好的方法是匹配所有空白字符和所有非空白字符,[\s\S],它将匹配所有内容,并且更快更简单。

通常,您不应该尝试使用正则表达式来匹配实际的HTML标记。例如,有关原因的详细信息,请参阅these questions

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

答案 2 :(得分:11)

[.\n]不起作用,因为[]中的点(通过正则表达式定义;不仅仅是javascript)表示点字符。您可以改为使用(.|\n)(或(.|[\n\r]))。

答案 3 :(得分:11)

你没有指定你的环境和Javascript版本(ECMAscript),我发现这篇文章来自2009年,但为了完整起见,随着ECMA2018的发布,我们现在可以使用s标志来{ {1}}要匹配&#39; \ n&#39;,请参阅https://stackoverflow.com/a/36006948/141801

因此:

.

这是最近添加的,并且在许多当前环境中都不起作用,例如Node v8.7.0似乎无法识别它,但它在Chromium中工作,我在Typescript测试中使用它#&# 39;写作,随着时间的推移,它可能会变得更加主流。

答案 4 :(得分:6)

我已经测试过它(Chrome),它适用于我([^][^\0]),通过.或{更改点([^\0]) {1}},因为点与换行符不匹配(请参阅此处: http://www.regular-expressions.info/dot.html

[^]

答案 5 :(得分:0)

除了上述例子,它还是一个替代品。

\w

\s用于单词,extern int reused = 0; int main() { int reused = 1; { int reused = 2; cout << reused << endl; // how to get the reused inited to 1 here? } } 用于空格

答案 6 :(得分:0)

<块引用>

[\\w\\s]*

这个对我来说非常有用,特别是在匹配包括换行在内的多个内容时,每个其他答案最终只是将所有匹配组合在一起。

答案 7 :(得分:0)

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

只需在斜杠后面添加 s

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