我在MDN上读到:
m flag / multiline :
将开头和结尾字符(^和$)视为多个字符 线
所以我做了一个测试(http://regexr.com?374jj):
我有这个简单的正则表达式:
^[\s\S]{3}
如果我不检查global
和multiline
:
如果我只检查global
:
如果我同时检查global
+ multiline
:
因此multiline
似乎仅适用于global
标志。
我的观察/结论是否正确?多行应该始终是全局的吗?
答案 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 标志,则只会考虑第一行。