JS正则提取URL中斜杠之间的值?

大佬们,如何用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.2k
avatarAI BotBETA

为了从URL中提取出斜杠(/)之间的值,并且这些值匹配给定的正则表达式模式,你可以使用JavaScript的match方法与正则表达式结合。

首先,你需要构建一个正则表达式,该表达式能够匹配斜杠之间的任意字符序列,并且捕获这些序列。然后,你可以使用match方法来应用这个正则表达式,并提取出匹配的部分。

在你的例子中,你可以这样构建正则表达式:

  • 由于你要匹配的字符串模式是{note}/:pakid:/corrinsdetail/{corrInsAleid}/{corrInsPakId}/{corrInsInsta}/{corrInsVernr}/{verFrom}/{verTo}/{name}:tab:,并且你想要提取notepakid的值,你可以创建一个正则表达式,它匹配{note}后面的内容,直到第一个/,以及:pakid:后面的内容,直到下一个/
  • 注意,由于你的模式字符串中{note}:pakid:是固定的,并且它们之间有一个斜杠,你可以直接使用这些作为匹配模式的一部分。

下面是完成这个任务的JavaScript代码:

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";

// 构建正则表达式
let regex = new RegExp(pattern.replace(/\{\w+\}|:\w+:/g, '([^/]+)'), 'g');

// 提取匹配的值
let matches = url.match(regex);

// 解析匹配的结果到对应的变量
let note = matches[0];
let pakid = matches[1];

console.log("note = “" + note + "”");
console.log("pakid = “" + pakid + "”");

在这段代码中,RegExp构造函数用于创建一个正则表达式对象,其中pattern.replace(/\{\w+\}|:\w+:/g, '([^/]+)'){note}:pakid:替换为([^/]+),这表示匹配一个或多个非斜杠字符的序列。g标志表示全局匹配,即匹配所有出现的模式,而不仅仅是第一个。

然后,url.match(regex)方法用于在URL字符串中查找所有与正则表达式匹配的子字符串,并将它们作为数组返回。

最后,matches[0]matches[1]分别包含notepakid的值,这些值被提取并打印出来。

5 个回答

代码
代码显得有点长,为了兼容异常情况,

  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

简单写了下,不太清楚你的具体的逻辑,供你参考

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";
let obj = {}
// note = “0001668882”
// pakid = “41”
pattern.split("/").forEach((item, index) => {
    if (item.indexOf("{") !== -1) {
        let key = item.replace("{", "").replace("}", "");
        obj[key] = url.split("/")[index];
    }
    if (item.indexOf(":") !== -1) {
      let key = item.replace(":", "").replace(":", "");
      obj[key] = url.split("/")[index];
  }
});
console.log(obj);

image.png

URL Pattern API

const pattern = '{note}/:pakid:/corrinsdetail/{corrInsAleid}/{corrInsPakId}/{corrInsInsta}/{corrInsVernr}/{verFrom}/{verTo}/{name}/:tab:',
    url = '0001668882/41/corrinsdetail/0001023444/41/0020751259/0005/756/756/SAP_BASIS/ValidityDetails'

const parsedPattern = pattern
        .replaceAll(/:(\w+):/g, (_, p) => `:${p}`)
        .replaceAll(/\{(\w+)\}/g, (_, p) => `:${p}`),
    urlPattern = new URLPattern({ pathname: parsedPattern })

console.log(urlPattern.exec({ pathname: url })?.pathname.groups)

结果:

{
  note: "0001668882",
  pakid: "41",
  corrInsAleid: "0001023444",
  corrInsPakId: "41",
  corrInsInsta: "0020751259",
  corrInsVernr: "0005",
  verFrom: "756",
  verTo: "756",
  name: "SAP_BASIS",
  tab: "ValidityDetails"
}

注意:你的 pattern.../{verTo}/{name}:tab:,我觉得应该少了一个 /,我这里的 pattern.../{verTo}/{name}/:tab:

你说的是这个意思?

image.png

'Alice 14'.match(/(?<name>\w+)\s(?<age>\d+)/)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏