花括号内的Regex匹配键值对



我正在尝试捕获花括号内的键:值对。对于以下字符串,它应该返回类似k2:v2和k3:v3 的内容

Str = “k1:v1abc{k2:v2,k3:v3}{test}”

我有以下正则表达式,它们分别捕获了我需要的内容,但我不知道如何将它们组合在一起。

/(w+):(w+)/g>gt>捕获密钥:值/{.*?}/g>gt>捕获{}之间的所有内容

如果您的环境支持lookbacking断言中的量词:

(?<={[w:,]*)w+:w+(?=[w:,]*})

模式匹配:

  • (?<={[w:,]*)正向查找,断言{和左侧允许字符的可选重复
  • w+:w+匹配1+个字符:和1+个字字符
  • (?=[w:,]*})正向前瞻,断言右侧允许的字符和}的可选重复

查看regex演示。

const str = "k1:v1abc{k2:v2,k3:v3}{test}";
const regex = /(?<={[w:,]*)w+:w+(?=[w:,]*})/g;
console.log(str.match(regex));

另一种方法可以使用两次传递,首先匹配格式并获取捕获组中大括号之间的部分。

如果匹配,请用逗号分隔组1。

{(w+:w+(?:,w+:w+)*)}

模式匹配:

  • {比赛开场{
  • (捕获组1
    • w+:w+匹配1+个单词字符:和1+个字符
    • (?:,w+:w+)*可选地重复,和相同的先前模式
  • )
  • }比赛结束}

const str = "k1:v1abc{k2:v2,k3:v3}{test}";
const regex = /{(w+:w+(?:,w+:w+)*)}/;
const m = str.match(regex);
if (m) console.log(m[1].split(","));

最新更新