Golang正则如何添加if条件 实现分组存在时匹配对应分隔符
正则路径条件匹配实现方案
需求说明
- 实现条件匹配逻辑:当路径中存在
public/分组时,匹配内容截止到文件名前的下划线_位置;当该分组不存在时,匹配内容截止到最后一级目录的斜杠/位置。 - 现存问题:使用
?=()正向预查语法实现if-else判断时,在线正则编辑器兼容性差无法正常识别,原有正则对非public路径的提取结果不符合预期。
测试用例对照
- 用例1(含
/public/前缀)- 原字符串:
/public/weltweit/nfsk/2022/05/18/668e9f57-30be-40b6-bc85-5bf66671e41d/668e9f57-30be-40b6-bc85-5bf66671e41d_AVC-270.mp4 - 原有正则:
^\/(\bpublic\b[\/])*(.+[a-z]{1,}.*[\/|_]+)+.*?$ - 匹配输出:
weltweit/nfsk/2022/05/18/668e9f57-30be-40b6-bc85-5bf66671e41d/668e9f57-30be-40b6-bc85-5bf66671e41d_,结果符合预期
- 原字符串:
- 用例2(不含
/public/前缀)- 原字符串:
/medp/ondemand/weltweit/fsk0/258/2580407/2580407_40256616.mp4 - 原有正则匹配输出:
medp/ondemand/weltweit/fsk0/258/2580407/2580407_,结果不符合预期 - 预期输出:
medp/ondemand/weltweit/fsk0/258/2580407/
- 原字符串:
实现方案
放弃依赖低兼容性的正则内置条件判断语法(如(?(condition)then|else)结构、嵌套预查实现的if逻辑),利用正则分支|的顺序优先匹配特性实现分支逻辑,兼容绝大多数在线编辑器、编程语言内置正则引擎:
- 参考正则表达式
^/public/(.+?_)|/(?!public/)(.+/)
- 规则拆解
- 第一个分支优先匹配:识别以
/public/开头的路径,贪婪捕获后续所有内容直到最后一个下划线_,满足public路径的匹配要求 - 第二个分支兜底匹配:通过负向预查排除
/public/开头的路径,贪婪捕获后续所有内容直到最后一个斜杠/,满足非public路径的匹配要求 - 结果提取:取两个捕获组中第一个非空的内容即可,无需额外代码判断分支
- 第一个分支优先匹配:识别以
- 验证结果
- 用例1捕获组1返回:
weltweit/nfsk/2022/05/18/668e9f57-30be-40b6-bc85-5bf66671e41d/668e9f57-30be-40b6-bc85-5bf66671e41d_,符合预期 - 用例2捕获组2返回:
medp/ondemand/weltweit/fsk0/258/2580407/,符合预期
- 用例1捕获组1返回:
适配提示:如果使用的正则引擎不支持负向预查,可直接通过匹配顺序实现逻辑:优先匹配
^/public/开头的字符串应用下划线终止规则,剩余所有字符串默认应用斜杠终止规则即可,无需额外做前缀排除。
内容的提问来源于stack exchange,提问作者TilakVarisetty
相关产品推荐
相关产品推荐

