如何设计正则表达式:仅在相邻可选有序分组间允许分隔符?
正则表达式匹配有序可选分段解决方案
需求回顾
需要匹配由分隔符:分隔的4个有序部分(对应示例中的A、B、C、D),规则如下:
- 所有部分可选,但至少存在一个部分
- 分隔符仅能出现在相邻有效部分之间
- 禁止以下无效内容:以
:开头/结尾、连续:、部分逆序(如B:A)、部分重复(如A:A)、无分隔符的拼接(如ABC)
简洁正则表达式方案
针对需求,可使用带正向预查的正则表达式,既避免手动枚举所有有效组合,又能严格过滤无效内容:
^(?!.*(A.*A|B.*B|C.*C|D.*D))(?!.*(B.*A|C.*(A|B)|D.*(A|B|C)))(?!:)(?!.*::)(?!.*:$)(?:A|B|C|D)(?::(?:A|B|C|D))*$
表达式拆解
(?!.*(A.*A|B.*B|C.*C|D.*D)):禁止任何部分重复出现(?!.*(B.*A|C.*(A|B)|D.*(A|B|C))):强制部分顺序(A只能在B/C/D前,B只能在C/D前,C只能在D前)(?!:):排除以:开头的字符串(?!.*::):排除包含连续:的字符串(?!.*:$):排除以:结尾的字符串(?:A|B|C|D)(?::(?:A|B|C|D))*:匹配一个或多个用:分隔的有效部分
适配实际场景
如果A、B、C、D的实际匹配规则更复杂(比如是特定格式的字符串),只需将表达式中对应的A/B/C/D替换为各自的正则模式即可,整体结构无需改动。
内容的提问来源于stack exchange,提问作者nullromo
相关产品推荐
相关产品推荐

