绝对首尾与行首尾
行锚点受多行模式影响,语义会随开关变化;而绝对串首、串尾锚点永远只认整段文本的头尾。需要严格校验完整字段时,用绝对锚点可以避免因为模式开关被改动而意外放宽。
末尾换行的分歧
行尾锚点在多数引擎里允许匹配「最后一个换行之前」的位置,所以带结尾换行的字符串也能通过校验,这在逐行读取文件内容后立刻校验时极易踩坑。绝对串尾锚点则不考虑这一让步,是更严格的选择。
基本信息
| 绝对串首 | 反斜杠大写 A,PCRE、Python、Java、RE2 等支持 |
|---|---|
| 绝对串尾 | 反斜杠小写 z 或大写 Z,含义因引擎而异 |
| 对照写法 | 脱字符与美元符号属于行锚点,行为受多行模式影响 |
| JS 现状 | 没有独立的绝对首尾记号,只能靠不加多行标志的锚点近似 |
| 推荐做法 | 校验字段时优先使用全串匹配接口,或先规整尾部空白再比对 |
典型使用场景
- 表单字段格式校验,要求整个输入都必须符合模式
- 解析固定格式的整份报文,确认内容从头到尾都被规则覆盖
- 校验从文件读入的字符串时避免末尾换行带来的宽松判定
- 在替换操作里定位真正的文本开头,而不是某一行开头
- 排查校验规则为何放过了带换行的输入
整串锚定的写法
整串锚定的写法
import re
re.search(r'\A\d{4}\Z', '2026') # 绝对首尾:整串必须恰好四位数字
re.search(r'^\d{4}$', '2026\n') # 行锚点对末尾换行较宽松,可能通过
re.fullmatch(r'\d{4}', '2026') # 用全串匹配接口,等价且更直观
re.search(r'\A\w+\Z', 'abc\ndef') # 含换行的输入会被绝对串尾拒绝
re.match(r'\d+$', '123 abc') # 只锚定开头不锚定结尾,容易误判
re.search(r'\A(?s).*\Z', 'a\nb') # 绝对首尾之间的内容允许跨行锚点严格程度对照
| 写法 | 含义 | 是否受多行模式影响 |
|---|---|---|
| 反斜杠大写 A | 绝对串首 | 否 |
| 脱字符 | 行首或串首 | 是 |
| 反斜杠大写 Z | 串尾或末尾换行之前(视引擎) | 否 |
| 反斜杠小写 z | 严格串尾 | 否 |
| 美元符号 | 行尾或串尾 | 是 |
同一符号在不同引擎里的严格程度并不统一:部分引擎的大写 Z 允许末尾换行前成立,小写 z 才是严格末尾。写跨语言代码时不要凭记忆照搬,先在目标引擎上验证一次。
更省心的方案是使用全串匹配接口。它把「整串必须被模式吃掉」表达成接口语义而不是模式记号,既避免了锚点差异,也让代码意图更清楚。