gpt4 book ai didi

javascript - 正则表达式模式 - 简单的字符串模板,对象映射

转载 作者:行者123 更新时间:2023-11-30 13:44:30 27 4
gpt4 key购买 nike

我在使用简单的正则表达式时遇到问题。

假设我有以下模板:

  • PWR_{state}
  • VOL_{region}_{level}
  • CHANEL_<key:1>_..._<key:n>

我的数据是这样的:

  • PWR_ON/PWR_OFF
  • VOL_MASTER_21
  • VOL_SECOND_76
  • CHANEL_<key:1>_..._<key:n>

我想要的只是一个将模板映射到值的对象:<强> PWR_ON :

{
"state": "ON", // "OFF"
}

VOL_SECOND_76 :

{
"region": "SECOND",
"level": "76"
}

这个元素如何存档?到目前为止我尝试了什么:

const CMD = "VOL_SECOND_21";
const TEMPLATE = "VOL_{region}_{level}";

// get parameter key name from template
//const names = /{(.+?)}/g.exec(cmd_obj.template);

const names = new RegExp("{(.+?)}", "gm").exec(TEMPLATE).slice(1);



// get values for parameter keys
const regex = TEMPLATE.replace(/{.+?}/g, "(.*)");
const values = new RegExp(regex, "g").exec(CMD).slice(1);


// key/value missmatch
// ["region", <level>] ["SECOND", "21"]
console.log(names, values)

这里的问题是只有第一个 {key}得到匹配,其余的被忽略,我不知道为什么。

然后我需要一种性感的方式来创建我的对象...

我有一种感觉,我可以更轻松地完成我尝试的事情。

最佳答案

RegExp.exec()方法通过查找匹配项并使用当前找到的索引更新 RegExp 对象来工作。然后您需要使用相同的 RegExp 对象再次调用 exec,您将获得下一个匹配项,依此类推。

由于您只使用一个表达式调用 TEMPLATE exec 一次,您将获得第一个匹配项。

CMD exec 之所以有效,是因为该表达式可以匹配您要查找的所有内容。

您可以使用 String.match() 而不是 exec ,并创建一个将捕获所有相关组的表达式。

要创建对象,map名称和值配对,并使用 Object.fromEntries()获取新对象。

const CMD = "VOL_SECOND_21";
const TEMPLATE = "VOL_{region}_{level}";

const names = TEMPLATE.match(/[^\{\}]+(?=\})/g);

const regex = TEMPLATE.replace(/{.+?}/g, "(.*)");
const values = CMD.match(new RegExp(regex)).slice(1);

const result = Object.fromEntries(names.map((s, i) => [s, values[i]]))

console.log(result)

关于javascript - 正则表达式模式 - 简单的字符串模板,对象映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59570984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com