2021 年 11 月 1 日

多行模式的锚点 ^ $,标志 "m"

多行模式由标志 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 用于在结果中需要换行符时,而锚点用于查找行开头/结尾的某个东西。

教程地图

评论

在评论之前阅读…
  • 如果您有改进建议,请 提交 GitHub 问题 或拉取请求,而不是评论。
  • 如果您无法理解文章中的某些内容,请详细说明。
  • 要插入几行代码,请使用 <code> 标签,对于多行,请将它们包装在 <pre> 标签中,对于超过 10 行,请使用沙箱(plnkrjsbincodepen…)