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

How to use JavaScript regex over multiple lines?

1
2
3
var ss="[cc lang="javascript"]aaaa
bbb
ccc

ddd";
var arr = ss.match(/

1
2
/gm );
alert(arr);     // null

我希望可以拾取PRE块,即使它跨越换行符也是如此。 我以为'm'标志可以做到。 才不是。

发布前在这里找到答案。 因为我以为我知道JavaScript(读了三本书,花了很多时间),所以SO上没有现有的解决方案,所以无论如何我都敢发表。 在这里扔石头

所以解决方案是:

1
2
3
var ss="[cc lang="javascript"]aaaa
bbb
ccc

ddd";
var arr = ss.match(/

1
2
/gm );
alert(arr);     // [cc lang="javascript"]...

:)

有谁有一个不太神秘的方式?

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

它建议[^]作为"多行点"。 我仍然不明白的是为什么[.
]
无法正常工作。 猜猜这是JavaScript的不幸部分之一。


请勿使用(.|[

])而不是.进行多行匹配。

请勿使用[\s\S]而不是.进行多行匹配

另外,通过使用*?+?量词而不是*+避免不必要的贪婪。这会对性能产生巨大影响。

请参阅我制定的基准测试:http://jsperf.com/javascript-multiline-regexp-workarounds

1
2
3
4
5
6
7
8
Using [^]: fastest
Using [\s\S]: 0.83% slower
Using (.|
|
): 96% slower
Using (.|[

]): 96% slower

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


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

]))。


我已经对其进行了测试(Chrome),并且通过将[^\0][^]更改了点(.)来对它([^][^\0])都有效,因为点与换行符不匹配(请参见此处:http://www.regular-expressions.info/dot.html)。

1
2
3
var ss="[cc lang="javascript"]aaaa
bbb
ccc

ddd";
var arr = ss.match(/

1
2
/gm );
alert(arr);     //Working


除上述示例外,它是替代方案。

1
^[\\w\\s]*$

其中\w用于单词,而\s用于空格