js中,正则表达式m修饰符说明

在 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); 

代码解释

  1. 定义多行文本字符串 :
    • multiLineText 是一个包含多行文本的字符串,每行以换行符分隔。
  2. 定义正则表达式并使用 m 修饰符 :
    • /^[A-Z]/gm 是正则表达式,其中 ^ 表示行的开始,[A-Z] 表示匹配大写字母,g 修饰符表示全局匹配(查找所有匹配项而不是找到第一个就停止),m 修饰符表示多行模式。
  3. 使用 match 方法查找匹配项 :
    • multiLineText.match(regexWithM) 方法会在 multiLineText 中查找所有满足正则表达式的匹配项,并返回一个包含所有匹配项的数组。
  4. 输出结果 :
    • 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"
相关推荐
Patrick在香港2 天前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
echome8882 天前
Python 正则表达式:5 个日常够用的模式
python·正则表达式
yivifu4 天前
能够使用Python正则表达式函数的文本处理工具——Calibre电子书编辑器
正则表达式
全栈陈序员4 天前
【Python】基础语法入门(二十九)—— 正则表达式实战:文本处理利器
开发语言·人工智能·python·正则表达式
BruceXu10 天前
\b 在中文里会静默失效:三个正则坑和一份能用的字符边界方案
正则表达式
阿昭L11 天前
正则表达式
正则表达式·编译原理
波力海苔夹心脆67512 天前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
FRing0313 天前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
小白快快跑哦15 天前
python-字符串全解(六):正则表达式-元字符与转义
python·正则表达式·字符串·元字符·转义
小白快快跑哦17 天前
python-字符串全解(六):正则表达式-逻辑运算或
python·正则表达式·字符串·逻辑运算