多行模式由修饰符 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…)