m标志使^和$匹配每行起止而非全文起止,不改变.的行为,启用方式因语言而异:js用/m、python用re.m、pcre用/m;^在m模式下同时匹配字符串开头和换行后位置,$同理匹配字符串末尾。

正则表达式中的 m 标志(multiline) 用于让 ^ 和 $ 分别匹配每一行的开头和结尾,而不是整个字符串的开头和结尾。它不改变 . 的行为(. 默认仍不匹配换行符),也不影响其他锚点如 \b 或 \A/\Z。
启用 m 标志的方式
不同语言/环境启用方式略有差异,但核心一致:
- JavaScript:在正则字面量末尾加
m,例如/^start/m;或构造函数中传入'm',如new RegExp('^start', 'm') - Python:使用
re.MULTILINE标志,或简写为re.M,例如re.findall(r'^\d+', text, re.M) - PCRE(PHP、Ruby 等):在模式末尾加
m,如/^\w+/m
^ 和 $ 在 m 模式下的实际表现
假设文本为:
Line 1Line 2
Line 3
普通模式下:/^Line \d+$/ 只能匹配整段字符串(即三行合起来满足条件才匹配,通常失败);
m 模式下:/^Line \d+$/m 会分别检查每一行——Line 1、Line 2、Line 3 都能独立匹配成功。
注意:$ 匹配的是行尾位置(换行符前),不是换行符本身;若行末有空格或制表符,需显式写出,如 /^Line \d+\s*$/m。
常见误区与注意事项
-
m不会让.匹配换行符——需要s标志(dotall)才能实现 -
^在 m 模式下仍匹配字符串开头,同时额外匹配每个换行符后的起始位置;$同理,也匹配字符串末尾 - 若想严格只匹配行首/行尾(排除字符串边界),可用
(? 或 <code>(?=\n)$等环视技巧(需引擎支持) - 多行文本中混用
\r\n、\n、\r时,确保换行符识别一致;部分引擎(如 Python 的re)默认能识别所有标准换行序列
实用小技巧
- 提取所有以
#开头的注释行:/^#\s*.*/m - 匹配每行开头的缩进(空格或制表符):
/^[ \t]*/m - 替换每行末尾的多余空格:
text.replace(/[ \t]+$/gm, '')(g + m 组合) - 验证每行是否符合某种格式(如邮箱):
^[\w.-]+@[\w.-]+\.\w+$配合m标志逐行校验











