两种括号两种职责
方括号定义的是一个字符集合,匹配其中任意一个字符,恰好消耗一个字符;圆括号定义的是一个分组,把若干元素串成一个整体,可能消耗多个字符,还能被单独取出来。混淆这两者,模式的含义会完全走样。
量词的作用对象差异
量词写在方括号后面,重复的是「集合中任取一个字符」这件事;写在圆括号后面,重复的是整组内容。这就是为什么希望重复多字符结构时必须用圆括号,而只想放宽某个位置的字符时用方括号更合适。
基本信息
| 方括号 | 定义字符集合,匹配其中一个字符,消耗一个字符 |
|---|---|
| 圆括号 | 定义分组,匹配整组内容,消耗多个字符并以整体参与重复 |
| 量词作用 | 方括号后重复单个字符位置,圆括号后重复整组 |
| 捕获能力 | 圆括号可捕获内容;方括号不产生捕获 |
| 嵌套写法 | 方括号内只表达集合;括号内可再嵌套字符类与分组 |
| 常见误区 | 用方括号表达有顺序的字符串,结果只匹配其中一个字符 |
典型使用场景
- 固定字符范围用方括号,例如只允许半角字母数字
- 重复多字符结构用圆括号,例如重复的键值对片段
- 同时要放宽字符又要取值时,外层用圆括号内层用方括号
- 校验有序字段用圆括号串接多个字符类
- 读陌生模式时先判断这一处的括号是集合还是分组
写法的语义差别
写法的语义差别
[abc] 匹配 a 或 b 或 c 之一
(abc) 匹配连续的 abc 三个字符,并捕获
[ab]+ 重复单个字符位置,可匹配 abb、abab
(ab)+ 重复整组,可匹配 abab、ababab
[0-9]{4} 四个数字位置,任一位置取一个数字
([0-9]{4}) 同上,但整体被捕获成一个字段
[.] 集合里只有一个点号:匹配字面点号
(.) 捕获任意一个字符
[a|b] 集合包含 a、竖线、b 三个字符,不是分支
(a|b) 分支:匹配 a 或 b方括号与圆括号对照
| 对比项 | 方括号 | 圆括号 |
|---|---|---|
| 匹配对象 | 单个字符 | 一段内容 |
| 消耗字符数 | 恒为 1 | 可能多于 1 |
| 是否捕获 | 否 | 是(普通括号) |
| 量词含义 | 重复该字符位置 | 重复整组内容 |
| 竖线含义 | 普通字符 | 分支运算符 |
竖线在方括号内只是普通字符,在方括号外才是分支。想表达「a 或 b」用方括号,想表达「这一串或那一串」用圆括号加竖线,两者不可互换。
只在需要取值或对多字符结构施加量词时才用圆括号;纯粹用来分组结构而不取值,建议改用非捕获写法,避免组编号无意义地增长。