在 JavaScript 的正则表达式中,修饰符 m
(多行模式)并不是严格按照回车(\r
)作为换行准则,而是以换行符(\n
)、回车符(\r
)、回车后跟着换行符(\r\n
)等行终止符作为换行判断依据。下面详细解释:
修饰符 m
的作用
在默认情况下,正则表达式中的锚点 ^
匹配字符串的开始位置,$
匹配字符串的结束位置。当使用修饰符 m
开启多行模式时,^
不仅能匹配整个字符串的开始位置,还能匹配每一行的行首;$
不仅能匹配整个字符串的结束位置,还能匹配每一行的行尾。
行终止符的定义
JavaScript 里,常见的行终止符有:
\n
:换行符,常用于 Unix 和 Linux 系统。\r
:回车符,早期用于 Mac 系统。\r\n
:回车后跟着换行符,常用于 Windows 系统。
示例代码
// 包含多行的字符串,包含不同的行终止符
const multiLineText = "Hello\nWorld\rWelcome\r\nEveryone"; // 不带 m 修饰符的正则表达式
const patternWithoutM = /^Welcome/;
console.log(patternWithoutM.test(multiLineText)); // false // 带 m 修饰符的正则表达式
const patternWithM = /^Welcome/m;
console.log(patternWithM.test(multiLineText)); // true
代码解释
- 示例中的字符串
multiLineText
包含了不同的行终止符(\n
、\r
和\r\n
)。 - 正则表达式
/^Welcome/
没有使用m
修饰符,^
仅匹配整个字符串的开始位置,所以patternWithoutM.test(multiLineText)
返回false
。 - 正则表达式
/^Welcome/m
使用了m
修饰符,^
不仅匹配整个字符串的开始位置,还能匹配每一行的行首,所以patternWithM.test(multiLineText)
返回true
。
综上,JavaScript 正则表达式的修饰符 m
会识别多种行终止符来实现多行匹配,而不只是以回车作为换行准则。
例子2
在 JavaScript 中,正则表达式的修饰符 m
是多行模式(multiline mode)。当使用修饰符 m
时,^
和 $
匹配的不再是整个字符串的开始和结束位置,而是每一行的开始和结束位置。
示例代码
// 定义一个包含多行文本的字符串
const multiLineText = `Hello
World
JavaScript`; // 定义一个正则表达式,使用 m 修饰符
const regexWithM = /^[A-Z]/gm; // 使用 match 方法查找所有匹配项
const matches = multiLineText.match(regexWithM); // 输出匹配结果
console.log(" 匹配到的首字母:", matches);
代码解释
- 定义多行文本字符串:
multiLineText
是一个包含多行文本的字符串,每行以换行符分隔。
- 定义正则表达式并使用
m
修饰符:/^[A-Z]/gm
是正则表达式,其中^
表示行的开始,[A-Z]
表示匹配大写字母,g
修饰符表示全局匹配(查找所有匹配项而不是找到第一个就停止),m
修饰符表示多行模式。
- 使用
match
方法查找匹配项:multiLineText.match(regexWithM)
方法会在multiLineText
中查找所有满足正则表达式的匹配项,并返回一个包含所有匹配项的数组。
- 输出结果:
console.log
输出匹配到的所有大写字母,即每行的首字母。
没有使用 m
修饰符的对比示例
// 定义一个包含多行文本的字符串
const multiLineText = `Hello
World
JavaScript`; // 定义一个正则表达式,不使用 m 修饰符
const regexWithoutM = /^[A-Z]/g; // 使用 match 方法查找所有匹配项
const matchesWithoutM = multiLineText.match(regexWithoutM); // 输出匹配结果
console.log(" 不使用 m 修饰符的匹配结果:", matchesWithoutM);
在没有使用 m
修饰符的情况下,^
只匹配整个字符串的开始位置,所以只会匹配到第一行的首字母。而使用 m
修饰符后,^
会匹配每一行的开始位置,从而匹配到所有行的首字母。
例子3
let str = "line1\nline2\nline3\n";
let regex3 = /3$/; // 没有m修饰符
let regex4 = /3$/m; // 有m修饰符console.log(regex3.exec(str)); // 输出为null,因为整串中最后有个换行符,"3"不是在整个字符串的绝对结尾
console.log(regex4.exec(str)); // 输出 ["3"],因为m修饰符使得"$"可以匹配每行换行前的位置,最后一行换行前就是"3"