如何用正则表达式去除URL中的.git后缀?
问题:Bitbucket URL正则提取时自动去除slug的.git后缀
我有两个Bitbucket格式的URL:
https://bitbucket.org/test/test-x.gitssh://git@bitbucket.org/test/test-x
目前使用正则表达式 r"(?:ssh|https):\/\/(?:(?:git@|)bitbucket.org)\/([^/]*)\/([^/]*)" 可以成功提取project和slug分组,但希望在正则中自动去除slug分组里可能存在的.git后缀,尝试添加非捕获组(?:.git|)未成功,请问正确的实现方式是什么?
解决方案
问题核心有两个:一是你没转义正则中的.(.在正则里是匹配任意字符的通配符,必须转义成\.才能表示字面意义的点);二是可选后缀的位置和匹配逻辑需要调整,避免把.git包含进捕获组。
调整后的正则表达式
r"(?:ssh|https):\/\/(?:git@)?bitbucket.org\/([^/]*)\/([^/]+?)(?:\.git)?"
关键改动说明
- 将
(?:.git|)替换为(?:\.git)?:\.转义后匹配字面的点,?表示该后缀可选(出现0次或1次),写法更简洁规范。 - 将slug分组的
([^/]*)改为([^/]+?):+?是非贪婪匹配,确保遇到.git时立即停止匹配,避免把.git也纳入slug捕获组;如果用贪婪的[^/]*,会把.git也包含进去,导致后面的可选后缀匹配失效。
测试验证
- 对
https://bitbucket.org/test/test-x.git,提取结果:project为test,slug为test-x - 对
ssh://git@bitbucket.org/test/test-x,提取结果:project为test,slug为test-x
如果slug本身包含点(比如test.x.git),该正则也能正确提取test.x作为slug,不会误删中间的点。
另一种实现方式(正向预查)
也可以用正向预查来确保捕获组不包含.git,写法如下:
r"(?:ssh|https):\/\/(?:git@)?bitbucket.org\/([^/]*)\/([^/]+)(?=\.git$|$)"
这里的(?=\.git$|$)是正向预查,要求匹配的内容后面要么是.git结尾,要么是字符串结尾,从而自动排除.git后缀。
内容的提问来源于stack exchange,提问作者ParthS007
相关产品推荐
相关产品推荐

