正则表达式多行模式必须显式启用,否则^和$仅匹配整个字符串首尾;启用后^匹配字符串开头或每个\n之后位置,$匹配字符串结尾或每个\n之前位置。

正则表达式中多行模式(Multiline Mode)的触发条件,核心就一条:必须显式启用。它不会自动生效,也不依赖字符串是否含换行符。
必须主动开启,否则^和$只认整个字符串边界
默认情况下,无论文本有多少行,^ 只匹配整个字符串最开头,$ 只匹配整个字符串最末尾。哪怕字符串里有 \n,锚点也不会“感知”到换行存在。
- JavaScript:在正则字面量末尾加
m标志,如/^abc$/m - Java:传入
Pattern.MULTILINE标志,或使用内联标志(?m) - Python:传入
re.MULTILINE或re.M,或写成(?m)放在模式开头
启用后,^和$的行为才真正“逐行生效”
开启多行模式后,^ 和 $ 的含义扩展为:
-
^匹配:字符串开头位置 或 每个\n字符之后的位置(即每行开头) -
$匹配:字符串结尾位置 或 每个\n字符之前的位置(即每行结尾)
注意:$ 不匹配 \n 本身,而是匹配它前面那个字符的位置;所以最后一行若无换行符,$ 仍能匹配其末尾。
常见误判:换行符存在 ≠ 多行模式生效
很多初学者以为只要字符串含 \n,^ 就会自然匹配每行开头——这是错的。例如:
- Python 中
re.findall('^a', 'a\na')返回['a'](仅首行) - 加上
re.M后才返回['a', 'a'] - 同理,JavaScript 中
'a\na'.match(/^a/g)只得一个a,加m才得两个
和其他模式可共存,但作用独立
多行模式只影响 ^ 和 $,不影响其他元字符:
- 点号
.依然不匹配\n—— 需要DOTALL(s标志)单独启用 -
\s、\S等仍按原有规则工作 - 可同时用
(?ms)或re.M | re.S,但两者解决的是不同问题











