JS正则匹配GitHub路径时如何解决前缀匹配导致的误判问题
问题根因
原有正则^(?:\/[^\/]*){2}(?:\/tree|)的bug出在最后一个非捕获组的写法:(?:\/tree|)中|后没有任何内容,代表这个分组可以匹配长度为0的空字符串。这就导致正则只要匹配完前两段路径(即/foo/bar部分)就可以判定匹配成功,完全不会校验第三段路径的内容,因此第三段为blob的测试用例会被误判为通过。
另外原正则没有加行尾锚点$,也是导致只匹配前缀就返回成功的重要原因。
修正方案
使用以下正则即可满足全部匹配要求:
const pattern = /^\/[^\/]+\/[^\/]+(?:\/tree(?:\/.*)?)?$/
各部分逻辑说明:
^\/[^\/]+\/[^\/]+:匹配路径开头的前两段,对应GitHub的/用户名/仓库名根路径结构,用+而非*是为了避免匹配到空路径段的非法格式(?:\/tree(?:\/.*)?)?:外层加?代表这部分是可选内容:- 没有第三段路径时,直接匹配根路径
- 存在第三段路径时,第三段必须严格为
tree,tree后可以接任意深度的子路径,也可以不接后续内容
$:行尾锚点,强制校验完整字符串,避免只匹配前缀就返回成功的问题
测试结果验证
所有给定用例的匹配结果均符合预期:
/foo/bar:匹配通过(仓库根路径)/foo/bar/tree/baz:匹配通过(第三段为tree的子路径)/foo/bar/tree/baz/foobar:匹配通过(第三段为tree的多层子路径)/foo/bar/blob:匹配失败(第三段存在且值不为tree)/foo/bar/blob/x.js:匹配失败(第三段存在且值不为tree)
内容的提问来源于stack exchange,提问作者rschristian
相关产品推荐
相关产品推荐

