首页/开发/正则与编码速查/空分支与可选分支的匹配后果
正则基础45 条

空分支与可选分支的匹配后果

竖线一侧留空构成空分支,它匹配空串,等价于把该部分写成可选;代价是引入空匹配,与量词组合时还可能造成零宽重复。用问号量词替代空分支语义相同且更清晰,跨工具使用前需验证兼容性。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌​‌‌​​​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​‌‌‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

空分支是合法的

竖线两侧允许有一侧什么都不写,这样的分支匹配空串。它等价于把该位置写成可选:一个有内容的分支加一个空分支,效果与给这部分内容加上问号量词相同。

代价是空匹配

一旦模式中存在空分支,整条模式也可能匹配空串,于是查找结果里混入空串、替换时插入多余内容。用在重复结构内部时更危险:既可能造成零宽循环,也会让回退次数上升。

基本信息

写法竖线一侧留空,如内容加竖线,或竖线加内容,或两支之间留空
等价关系有内容加空分支等价于该内容可选
匹配结果空分支匹配零个字符,属空匹配
风险与量词组合时可能造成零宽重复与性能下降
引擎差异多数引擎接受空分支;少数工具或模式对空分支行为未定义或直接报错,跨工具使用前先验证
替代写法用问号量词或可选分组表达同样语义,意图更清楚

典型使用场景

  • 模式末尾允许缺省后缀时快速补一个空分支
  • 匹配字段里的可选前缀,例如可能出现的符号
  • 处理规则文件中「该项可以为空」的语义
  • 排查结果里为什么出现空串,检查模式是否存在空分支
  • 重构历史模式时把隐式空分支改为显式可选写法

空分支的写法与替代

空分支的写法与替代
import re
re.findall(r'\d+|', '1a2')        # 空分支让模式到处都能匹配,结果夹带空串
re.findall(r'\d+', '1a2')         # 去掉空分支后结果干净
re.fullmatch(r'ab|', 'ab')         # 有内容加空分支:等价于该内容整体可选
re.fullmatch(r'(?:ab)?', 'ab')     # 更清楚的等价写法
re.search(r'(a||b)', 'b')          # 空分支夹在中间同样成立
re.findall(r'(?:,|$)', 'a,b')      # 用锚点替代空分支表达行尾,可读性更好

空分支与等价写法

写法含义建议
内容加空分支内容可选改用问号量词,意图更明确
空分支加内容同上,顺序不影响语义同上
两支之间留空中间位置可选补出具体内容或改结构
空分支配量词零宽重复风险避免在重复内部留空分支
把空分支改写成问号量词几乎总是更好的选择:语义相同、可读性更高,也便于后续维护者看出「这里是可选的」,而不必反推竖线一侧为什么是空的。
空分支出现在重复量词内部时,引擎可能在同一位置反复尝试零宽匹配。排查表现为匹配卡顿或结果数量异常的模式时,优先检查是否存在空分支与量词的组合。
不同工具对空分支的容忍度不一致,部分实现会报语法错误或行为未定义。把模式从一种工具搬到另一种工具之前,先用最小样本确认空分支被如何解释。

易错点

  • 无意中留下空分支,模式到处都能匹配空串,查找与替换结果异常
  • 在重复量词内部使用空分支,出现零宽重复,匹配卡顿或结果数量异常
  • 把空分支当作「可选」的惯用写法长期保留,维护者难以理解模式意图
  • 跨工具复用含空分支的模式,个别实现报错或行为不同

数据来源与参考

  • PCRE2 官方文档 pcre2pattern(3):空分支与可选分支
  • IEEE POSIX.1-2017 Base Definitions 第 9 章:分支表达式
  • Python 官方文档 re 模块:或运算与空匹配

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/regex-alternation-empty-branch.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌​‌‌​​​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​‌‌‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​