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