大佬们,如何用js正则匹配,得出每个“/”中间的值
let pattern = "{note}/:pakid:/corrinsdetail/{corrInsAleid}/{corrInsPakId}/{corrInsInsta}/{corrInsVernr}/{verFrom}/{verTo}/{name}/:tab:";
let url = "0001668882/41/corrinsdetail/0001023444/41/0020751259/0005/756/756/SAP_BASIS/ValidityDetails";
输入上述数据,期望得到结果
{
note: "0001668882",
pakid: "41",
corrInsAleid: "0001023444",
corrInsPakId: "41",
corrInsInsta: "0020751259",
corrInsVernr: "0005",
verFrom: "756",
verTo: "756",
name: "SAP_BASIS",
tab: "ValidityDetails"
}
代码
代码显得有点长,为了兼容异常情况,
1. 检验url是否符合pattern,
2. url如果含有参数 "?zz=23423" 或者 "#abc",需要清洗
3. url中如果含有"-"也要兼容,不仅仅是"_"和数字、字母let pattern = "{note}/:pakid:/corrinsdetail/{corrInsAleid}/{corrInsPakId}/{corrInsInsta}/{corrInsVernr}/{verFrom}/{verTo}/{name}/:tab:";
let url = "0001668882/41/corrinsdetail/0001023444/41/0020751259/0005/756/756/SAP_BASIS/ValidityDetails";
function extractInfo(pattern, url) {
const urlRegex = new RegExp(pattern.replace(/(\{|:)[\w-]+(\}|:)/g, "\[\\w-]+").replace(/\//g, "\/"));
if(!urlRegex.test(url)) {
throw new Error("输入的Url不符合Pattern");
}
let keys = pattern.split("/");
let values = url.replace(/(\?|#).*/, "").split("/");
let result = {};
keys.forEach((v,i)=>{
if(/(\{|:)\w+(\}|:)/.test(v)) {
result[v.replace(/(\{|:|\})/g,"")] = values[i];
}
})
return result;
}
console.log(extractInfo(pattern, url));
输出结果
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240929/8ff8429abad0e914240067449722a71e.png)