正则表达式构造咨询:实现foo、bar可选且按规则匹配分隔空格
正则表达式构造方案
先明确核心要求:
foo(小写字母串)和bar(非开头为0的数字串)都是可选项,可单独出现或同时出现- 两者同时出现时,中间必须有且仅有一个空格
- 单独出现
bar时不能有前导空格,单独出现foo时不能有末尾空格 - 禁止
foo和bar直接拼接(无空格),也禁止foo后面只带空格却没有bar
最终正则表达式
^(?:(?<foo>[a-z]+)(?: (?<bar>[1-9]+))?|(?<bar>[1-9]+))$
规则拆解
这个表达式通过两个分支覆盖所有合法场景:
- 第一个分支
(?<foo>[a-z]+)(?: (?<bar>[1-9]+))?- 先匹配
foo分组(小写字母组成的字符串) - 后面跟着一个可选的非捕获分组:
(?: (?<bar>[1-9]+))?,意思是只有当bar存在时,才会匹配前面的空格,从根源避免了foo后面单独带空格的无效情况
- 先匹配
- 第二个分支
(?<bar>[1-9]+)- 单独匹配
bar分组,确保没有前导空格,直接匹配纯数字串
- 单独匹配
示例验证
- 匹配成功的情况:
abc 100:命中第一个分支,foo=abc,bar=100abc:命中第一个分支的foo部分,bar未匹配100:命中第二个分支,bar=100
- 匹配失败的情况:
abc(末尾带空格):第一个分支的可选部分无法匹配,整个字符串无法被覆盖abc100:无空格分隔,第一个分支和第二个分支均不匹配
内容的提问来源于stack exchange,提问作者NWoodsman
相关产品推荐
相关产品推荐

