能否用单个JavaScript正则表达式解析两种GitLab URL格式?
用单个正则解析两种GitLab URL格式
有两种GitLab URL需要处理:
- 项目分支路径格式:
const str1 = "https://gitlab.com/myproject/my_product/prd/projectbranch/-/tree/master/src/tools/somepath/somename" - 合并请求(MR)格式:
const str2 = "https://gitlab.com/myproject/my_product/prd/projectbranch/-/merge_requests/20"
目前用这个正则能解析第一种URL:
const [_, baseUrl, type, branchName, relativePath] = str1.match(/(.*)\/-\/(tree|merge_requests)\/(.+?)(?:\/(.*$))/)
但没法用同一个正则同时解析第二种,想要单个正则既能拿到MR的编号(比如示例里的20),又不破坏第一种URL的解析结果。
解决方案
修改正则表达式,让相对路径部分变为可选,同时确保MR编号能被正确捕获:
const regex = /(.*)\/-\/(tree|merge_requests)\/([^\/]+)(?:\/(.*))?$/;
正则说明:
(.*)\/-\/: 和原正则一致,捕获项目的基础URL部分(tree|merge_requests): 捕获URL类型,区分是分支路径还是合并请求([^\/]+): 匹配斜杠以外的所有字符——对tree类型来说,这部分是分支名;对merge_requests类型来说,就是MR的编号(?:\/(.*))?$: 可选的非捕获组,匹配斜杠开头的相对路径,末尾的$确保匹配到URL结尾。如果是MR URL,这部分会返回undefined,不影响原有变量结构
测试效果
解析分支路径URL:
const str1 = "https://gitlab.com/myproject/my_product/prd/projectbranch/-/tree/master/src/tools/somepath/somename"; const [_, baseUrl, type, branchName, relativePath] = str1.match(regex); // baseUrl: "https://gitlab.com/myproject/my_product/prd/projectbranch" // type: "tree" // branchName: "master" // relativePath: "src/tools/somepath/somename"
解析MR URL:
const str2 = "https://gitlab.com/myproject/my_product/prd/projectbranch/-/merge_requests/20"; const [_, baseUrl, type, mergeRequestNumber] = str2.match(regex); // baseUrl: "https://gitlab.com/myproject/my_product/prd/projectbranch" // type: "merge_requests" // mergeRequestNumber: "20"
这样既保留了对原有分支路径URL的解析逻辑,又能正确提取MR的编号。
内容的提问来源于stack exchange,提问作者damdafayton
相关产品推荐
相关产品推荐

