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