Golang正则使用|分隔匹配串时仅最后一个子串匹配失败问题咨询
问题根因
正则表达式中|选择符的优先级最低,你没有给数字列表加分组限制,所以原始正则实际被拆分为3个独立的匹配分支,和你预期的「test/[任意数字]/test/xxx/四位年份/」格式完全不符:
- 分支1:
^test\/053783914460,仅匹配开头为test/053783914460的字符串 - 分支2:
182782814227,只要字符串任意位置出现这串数字就匹配成功 - 分支3:
161046048738\/test\/\S+\/\d{4}\/,仅匹配数字161046048738后面直接跟/test/xxx/四位年份/的内容,缺少了前缀test/的匹配逻辑
这就是为什么前两个数字对应的测试用例能匹配成功,第三个数字的用例匹配失败的核心原因。
修复方案
用非捕获分组把数字列表包起来,限制|的作用范围仅在数字选择项内部,修正后的正则如下:
^test\/(?:053783914460|182782814227|161046048738)\/test\/\S+\/\d{4}\/
其中(?:)是非捕获分组,仅用来限制运算符范围,不会额外生成捕获分组占用内存,性能更优。
验证效果
修正后所有符合预期格式的字符串都能正常匹配:
test/053783914460/test/random/2021/匹配成功test/182782814227/test/random/2021/匹配成功test/161046048738/test/random/2021/匹配成功
内容的提问来源于stack exchange,提问作者Riya John
相关产品推荐
相关产品推荐

