Regex的[m]标志是否必须带有[g]标志?

时间:2013-11-10 14:42:40

标签: javascript regex

我在MDN上读到:

m flag  / multiline : 
  

将开头和结尾字符(^和$)视为多个字符   线

所以我做了一个测试(http://regexr.com?374jj):

我有这个简单的正则表达式:

^[\s\S]{3}

如果我不检查globalmultiline

enter image description here

如果我只检查global

enter image description here

如果我同时检查global + multiline

enter image description here

因此multiline似乎仅适用于global标志。

我的观察/结论是否正确?多行应该始终是全局的吗?

2 个答案:

答案 0 :(得分:4)

m不要求或暗示g,不。考虑:

"foo\nbar".match(/^bar/)   // `null`

VS

"foo\nbar".match(/^bar/m)  // ["bar"]

使用m标记,^bar匹配,因为^匹配的开头。没有它,就没有匹配,因为^在输入字符串的开头不匹配。 m标志对结尾(行|输入)锚点$也有类似的效果。

当您需要多次进行匹配时,g标志会发挥作用。考虑这种差异,例如:

"foo\nbar\nfoo\nbar".replace(/^bar/m, "BAZ")

......这给了我们:

foo
BAZ
foo
bar

请注意,第二场比赛未被替换。如果我们添加g标志,则与结果进行比较:

"foo\nbar\nfoo\nbar".replace(/^bar/mg, "BAZ")

......这给了我们:

foo
BAZ
foo
BAZ

请注意,所有匹配都已被替换。

答案 1 :(得分:2)

嗯,这取决于你想要实现的目标。如果没有全局标志,您将只获得第一个匹配。如果没有 multiline 标志,则只会考虑第一行。