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的悲伤部分之一..
答案 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