|
1 | | -# Flag "m" — 多行模式 |
| 1 | +# 锚点 ^ $ 的多行模式,修饰符 "m" |
2 | 2 |
|
3 | | -通过 flag `/.../m` 可以开启多行模式。 |
| 3 | +多行模式由修饰符 `pattern:m` 启用。 |
4 | 4 |
|
5 | | -这仅仅会影响 `^` 和 `$` 锚符的行为。 |
| 5 | +它只影响 `pattern:^` 和 `pattern:$` 的行为。 |
6 | 6 |
|
7 | | -在多行模式下,它们不仅仅匹配文本的开始与结束,还匹配每一行的开始与结束。 |
| 7 | +在多行模式下,它们不仅仅匹配文本的开始与末尾,还匹配每一行的开始与末尾。 |
8 | 8 |
|
9 | | -## 行的开头 ^ |
| 9 | +## 搜索行的开头 ^ |
10 | 10 |
|
11 | | -在这个有多行文本的例子中,正则表达式 `/^\d+/gm` 将匹配每一行的开头数字: |
| 11 | +在这个有多行文本的例子中,正则表达式 `/^\d+/gm` 将从每行的开头取一个数字: |
12 | 12 |
|
13 | 13 | ```js run |
14 | 14 | let str = `1st place: Winnie |
15 | 15 | 2nd place: Piglet |
16 | | -33rd place: Eeyore`; |
| 16 | +3rd place: Eeyore`; |
17 | 17 |
|
18 | 18 | *!* |
19 | | -alert( str.match(/^\d+/gm) ); // 1, 2, 33 |
| 19 | +console.log( str.match(/^\d/gm) ); // 1, 2, 3 |
20 | 20 | */!* |
21 | 21 | ``` |
22 | 22 |
|
23 | | -没有 flag `/.../m` 时,仅仅是第一个数字被匹配到: |
24 | | - |
| 23 | +没有修饰符 `pattern:m` 时,仅会匹配第一个数字: |
25 | 24 |
|
26 | 25 | ```js run |
27 | 26 | let str = `1st place: Winnie |
28 | 27 | 2nd place: Piglet |
29 | | -33rd place: Eeyore`; |
| 28 | +3rd place: Eeyore`; |
30 | 29 |
|
31 | 30 | *!* |
32 | | -alert( str.match(/^\d+/g) ); // 1 |
| 31 | +console.log( str.match(/^\d/g) ); // 1 |
33 | 32 | */!* |
34 | 33 | ``` |
35 | 34 |
|
36 | | -这是因为默认情况下,锚符 `^` 仅仅匹配文本的开头,在多行模式下,它匹配行的开头。 |
| 35 | +这是因为默认情况下,锚点 `^` 仅匹配文本的开头,在多行模式下,它匹配行的开头。 |
| 36 | + |
| 37 | +```smart |
| 38 | +“行的开头”表示“就在换行符之后”:多行模式下的测试 `pattern:^` 匹配所有以换行符 `\n` 开头的位置。 |
37 | 39 |
|
38 | | -正则表达式引擎将会在文本中查找以锚符 `^` 开始的字符串,我们找到之后继续匹配 `\d+` 模式。 |
| 40 | +并且在文本开始的位置。 |
| 41 | +``` |
39 | 42 |
|
40 | | -## 行的结尾 $ |
| 43 | +## 搜索行的末尾 $ |
41 | 44 |
|
42 | | -美元符 `$` 行为也相似。 |
| 45 | +美元符 `pattern:$` 的行为也类似。 |
43 | 46 |
|
44 | | -正则表达式 `\w+$ 会找到每一行的最后一个单词: |
| 47 | +正则表达式 `pattern:\d$` 寻找每行的最后一个数字 |
45 | 48 |
|
46 | 49 | ```js run |
47 | | -let str = `1st place: Winnie |
48 | | -2nd place: Piglet |
49 | | -33rd place: Eeyore`; |
| 50 | +let str = `Winnie: 1 |
| 51 | +Piglet: 2 |
| 52 | +Eeyore: 3`; |
50 | 53 |
|
51 | | -alert( str.match(/\w+$/gim) ); // Winnie,Piglet,Eeyore |
| 54 | +console.log( str.match(/\d$/gm) ); // 1,2,3 |
52 | 55 | ``` |
53 | 56 |
|
54 | | -没有 `/.../m` flag 的话,美元符 `$` 将会仅仅匹配整个文本的结尾,所以只有最后的一个单词会被找到。 |
| 57 | +没有修饰符 `pattern:m`,那么美元符 `pattern:$` 将只会匹配整个文本的末尾,所以只有最后一个数字会被匹配。 |
55 | 58 |
|
56 | | -## 锚符 ^$ 对比 \n |
| 59 | +```smart |
| 60 | +“行的末尾”表示“就在换行符之前”:多行模式下的测试 `pattern:$` 匹配换行符 `\n` 后接的所有位置。 |
57 | 61 |
|
58 | | -要寻找新的一行的话,我们不仅可以使用锚符 `^` 和 `$`,也可以使用换行符 `\n`。 |
| 62 | +并且在文本末尾的位置。 |
| 63 | +``` |
59 | 64 |
|
60 | | -它和锚符 `^` 和 `$` 的第一个不同点是它不像锚符那样,它会“消耗”掉 `\n` 并且将其(`\n`)加入到匹配结果中。 |
| 65 | +## 搜索 \n 而不是 ^ $ |
61 | 66 |
|
62 | | -举个例子,我们在下面的代码中用它来替代 `$`: |
| 67 | +要寻找新的一行,我们不仅可以使用锚点 `pattern:^` 和 `pattern:$`,也可以使用换行符 `\n`。 |
| 68 | + |
| 69 | +区别是什么?让我们看个例子。 |
| 70 | + |
| 71 | +在这里我们使用 `pattern:\d\n` 进行搜索,而不是使用 `pattern:\d$`: |
63 | 72 |
|
64 | 73 | ```js run |
65 | | -let str = `1st place: Winnie |
66 | | -2nd place: Piglet |
67 | | -33rd place: Eeyore`; |
| 74 | +let str = `Winnie: 1 |
| 75 | +Piglet: 2 |
| 76 | +Eeyore: 3`; |
68 | 77 |
|
69 | | -alert( str.match(/\w+\n/gim) ); // Winnie\n,Piglet\n |
| 78 | +console.log( str.match(/\d\n/g) ); // 1\n,2\n |
70 | 79 | ``` |
71 | 80 |
|
72 | | -这里,我们每次匹配到的时候都会被添加一个换行符。 |
| 81 | +正如我们所看到的,这里找到了 2 个匹配项而不是 3 个。 |
| 82 | + |
| 83 | +这是因为在 `subject:3` 之后没有换行符(但是有文本末尾,所以它匹配 `pattern:$`)。 |
73 | 84 |
|
74 | | -还有一个不同点——换行符 `\n` 不会匹配字符串结尾。这就是为什么在上面的例子中 `Eeyore` 没有匹配到。 |
| 85 | +另一个区别是,现在每个匹配项都包含一个换行符 `match:\n`。与锚点 `pattern:^` `pattern:$` 不同,锚点只测试条件(行的开始/末尾),而 `\n` 是一个字符,因此它成为了结果的一部分。 |
75 | 86 |
|
76 | | -所以,通常情况下使用锚符更棒,用它匹配出来的结果更加接近我们想要的结果。 |
| 87 | +因此,当我们需要结果中有换行符时,使用 `\n`。而锚点则用于在行的开头/末尾查找某些内容。 |
0 commit comments