元字符分四类
常用元字符按职责分成四类:定位位置的锚点、描述单个字符的字符类、描述重复次数的量词、把模式组织起来的分组与分支。再加一个转义符号,就构成了绝大多数模式的全部符号。
类内类外两套规则
同一符号在方括号内外可能有两种含义,判断依据是它处于哪个位置以及是否处于首位。查表时先看这一列,比死记每个符号更有效。
基本信息
| 定位类 | 脱字符与美元符号表示位置,零宽不消耗字符 |
|---|---|
| 字符类 | 点号匹配任意字符,方括号定义集合,反斜杠字母组合定义预定义集合 |
| 量词类 | 星号、加号、问号、花括号控制重复次数 |
| 组织类 | 圆括号分组,方括号定义集合,竖线分支 |
| 转义类 | 反斜杠把元字符降级为普通字符,或把字母升级为特殊序列 |
| 扩展类型 | 断言、命名分组、属性类等属引擎扩展,支持范围以官方文档为准 |
典型使用场景
- 读一条陌生模式时按四类拆解,快速判断每部分在做什么
- 写模式时先定结构(分组与分支),再补字符与次数约束
- 排查语法错误:检查是否漏转义了当作字面量的元字符
- 评审模式时逐类核对是否存在过宽的字符类或过松的量词
- 把紧凑模式改写成带注释版本,按类别分段说明
一条模式的分类拆解
一条模式的分类拆解
\A(?P<y>\d{4})-(?P<m>\d{1,2})\Z
# \A 锚点:整串开始
# (?P<y>..) 分组:命名捕获,便于按名字取值
# \d{4} 字符类 + 量词:恰好四位数字
# - 字面量:分隔符,无需转义
# \d{1,2} 字符类 + 花括号量词:一到两位数字
# \Z 锚点:整串结束
[a-z.]+ # 类内:范围与点号都是集合成员
\w+ # 类外:字母数字下划线,下划线也算元字符总览
| 符号 | 类别 | 含义 | 类内是否仍特殊 |
|---|---|---|---|
| 点号 | 字符类 | 任意字符(视跨行开关) | 退化为普通字符 |
| 脱字符 | 定位 | 行或串开头 | 首位时取反 |
| 美元符号 | 定位 | 行或串结尾 | 普通字符 |
| 星号与加号 | 量词 | 零次或多次、一次或多次 | 普通字符 |
| 问号 | 量词 | 零次或一次,或非贪婪修饰 | 普通字符 |
| 花括号 | 量词 | 次数区间 | 普通字符 |
| 方括号 | 组织 | 定义字符集合 | 需要处理嵌套 |
| 圆括号 | 组织 | 分组与捕获 | 普通字符 |
| 竖线 | 组织 | 分支选择 | 普通字符 |
| 反斜杠 | 转义 | 降级或升级含义 | 仍为转义符 |
点号是否跨行、简写类是否按 Unicode 解释、断言是否被支持,都属于引擎与开关层面的差异。查总览表只能确认符号类别,具体语义要结合目标引擎的文档。
需要匹配的字符串本身含大量元字符(例如配置文件片段或代码行)时,优先使用字面查找或固定字符串模式,比逐个转义更可靠也更容易维护。