You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式去除URL中的.git后缀?

问题:Bitbucket URL正则提取时自动去除slug的.git后缀

我有两个Bitbucket格式的URL:

  1. https://bitbucket.org/test/test-x.git
  2. ssh://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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:30:50