原文链接:http://javascript.info/regexp-multiline-mode,translate with ❤️ by zhangbao.

多行模式使用 m 标记启用:/.../m

这个标记只会影响 ^$ 的行为表现。在多行模式下,它们不仅匹配字符串的开头和结尾,而且也可以匹配一行的起始/结束。

一行开始 ^

下面例子列举的文本占据多行。/^\d+/gm 匹配每一行开头的数字:

  1. let str = `1st place: Winnie
  2. 2nd place: Piglet
  3. 33rd place: Eeyore`;
  4. alert( str.match(/^\d+/gm) ); // 1,2,33

如果没有 /.../m 标记的话,只会匹配第一行头部的数字:

  1. let str = `1st place: Winnie
  2. 2nd place: Piglet
  3. 33rd place: Eeyore`;
  4. alert( str.match(/^\d+/g) ); // 1

这是因为默认插入符 ^ 仅会匹配文本的开始,在多行模式下,是匹配每行的开头。

正则表达式引擎沿着文本移动,查找字符串开始 ^,当发现后,继续匹配模式的剩下部分 \d+

一行结束 $

美元符号 $ 表现类似。

正则表达式 \w+$ 查找每行最后一个单词。

锚点 ^$ 对 \n

查找一个新行,我们不仅可以用 ^$,也可以用换行符 \n

第一个与锚点不同的是,字符 \n “消费”换行符并且被填入到最终的结果里。

例如,这里我们它而不是 $

  1. let str = `1st place: Winnie
  2. 2nd place: Piglet
  3. 33rd place: Eeyore`;
  4. alert( str.match(/\w+\n/gim) ); // Winnie\n,Piglet\n

在这里,每一个匹配都是一个单词加上一个换行符。

还有一个区别——换行符 \n 与字符串末端不匹配。这就是为什么在上面的例子中没有出现 Eeyore

所以,使用锚通常是更好的选择,它们更接近我们想要得到的结果。

(完)