原文链接:http://javascript.info/regexp-multiline-mode,translate with ❤️ by zhangbao.
多行模式使用 m 标记启用:/.../m。
这个标记只会影响 ^ 和 $ 的行为表现。在多行模式下,它们不仅匹配字符串的开头和结尾,而且也可以匹配一行的起始/结束。
一行开始 ^
下面例子列举的文本占据多行。/^\d+/gm 匹配每一行开头的数字:
let str = `1st place: Winnie2nd place: Piglet33rd place: Eeyore`;alert( str.match(/^\d+/gm) ); // 1,2,33
如果没有 /.../m 标记的话,只会匹配第一行头部的数字:
let str = `1st place: Winnie2nd place: Piglet33rd place: Eeyore`;alert( str.match(/^\d+/g) ); // 1
这是因为默认插入符 ^ 仅会匹配文本的开始,在多行模式下,是匹配每行的开头。
正则表达式引擎沿着文本移动,查找字符串开始 ^,当发现后,继续匹配模式的剩下部分 \d+。
一行结束 $
美元符号 $ 表现类似。
正则表达式 \w+$ 查找每行最后一个单词。
锚点 ^$ 对 \n
查找一个新行,我们不仅可以用 ^ 和 $,也可以用换行符 \n。
第一个与锚点不同的是,字符 \n “消费”换行符并且被填入到最终的结果里。
例如,这里我们它而不是 $:
let str = `1st place: Winnie2nd place: Piglet33rd place: Eeyore`;alert( str.match(/\w+\n/gim) ); // Winnie\n,Piglet\n
在这里,每一个匹配都是一个单词加上一个换行符。
还有一个区别——换行符 \n 与字符串末端不匹配。这就是为什么在上面的例子中没有出现 Eeyore。
所以,使用锚通常是更好的选择,它们更接近我们想要得到的结果。
(完)
