2

我在 MDN 上读到:

m flag  / multiline : 

将开始和结束字符(^ 和 $)视为处理多行

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

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

^[\s\S]{3}

如果我不检查global并且multiline

在此处输入图像描述

如果我只检查global

在此处输入图像描述

如果我同时检查global+ multiline

在此处输入图像描述

所以它似乎multiline只适用于global标志。

我的观察/结论是否正确?多行是否应该始终与 global 一起使用?

4

2 回答 2

4

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

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

对比

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

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

g您需要多次进行比赛时,旗帜就会发挥作用。考虑这种差异,例如:

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

...这给了我们:

富
巴兹
富
酒吧

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

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

...这给了我们:

富
巴兹
富
巴兹

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

于 2013-11-10T14:47:37.333 回答
2

好吧,这取决于您要达到的目标。如果没有全局标志,您将只能获得第一个匹配项。如果没有多行标志,则只考虑第一行。

于 2013-11-10T14:50:56.133 回答