多行模式由标志 m 启用。
它只影响 ^ 和 $ 的行为。
在多行模式下,它们不仅匹配字符串的开头和结尾,而且还匹配行的开头和结尾。
在行首搜索 ^
在下面的示例中,文本包含多行。模式 /^\d/gm 从每行的开头获取一个数字
let str = `1st place: Winnie
2nd place: Piglet
3rd place: Eeyore`;
console.log( str.match(/^\d/gm) ); // 1, 2, 3
没有标志 m 只有第一个数字匹配
let str = `1st place: Winnie
2nd place: Piglet
3rd place: Eeyore`;
console.log( str.match(/^\d/g) ); // 1
这是因为默认情况下,插入符号 ^ 仅匹配文本开头,在多行模式下,匹配任何行的开头。
请注意
“行开头”正式是指“紧接在换行符之后”:在多行模式下,测试 ^ 匹配所有以换行符 \n 开头的位置。
以及文本开头。
在行尾搜索 $
美元符号 $ 的行为类似。
正则表达式 \d$ 查找每行中的最后一个数字
let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;
console.log( str.match(/\d$/gm) ); // 1,2,3
如果没有标志 m,美元符号 $ 仅匹配整个文本的结尾,因此只会找到最后一个数字。
请注意
“行尾”正式是指“紧接在换行符之前”:在多行模式下,测试 $ 匹配所有以换行符 \n 结尾的位置。
以及文本结尾。
搜索 \n 而不是 ^ $
要查找换行符,我们不仅可以使用锚点 ^ 和 $,还可以使用换行符 \n。
有什么区别?让我们看一个例子。
这里我们搜索 \d\n 而不是 \d$
let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;
console.log( str.match(/\d\n/g) ); // 1\n,2\n
我们可以看到,有 2 个匹配项而不是 3 个。
这是因为 3 后面没有换行符(尽管有文本结尾,所以它匹配 $)。
另一个区别:现在每个匹配项都包含一个换行符 \n。与锚点 ^ $ 不同,锚点仅测试条件(行的开头/结尾),\n 是一个字符,因此它成为结果的一部分。
因此,模式中的 \n 用于在结果中需要换行符时,而锚点用于查找行开头/结尾的某个东西。
评论
<code>标签,对于多行,请将它们包装在<pre>标签中,对于超过 10 行,请使用沙箱(plnkr,jsbin,codepen…)