【问题标题】:Regex get key value for string object like { key=value, .... }正则表达式获取字符串对象的键值,例如 { key=value, .... }
【发布时间】:2022-11-02 13:02:45
【问题描述】:

我有类似的字符串

"{format=svg, width=383, height=480, transform=[40, 40, 40, 40], scaleX=1, scaleY=1}"

如何使用正则表达式返回具有键值的对象。非常感谢!

{
  format: 'svg',
  width: 383,
  height: 480,
  transform: [40, 40, 40, 40],
  scaleX: 1,
  scaleY: 1
}

【问题讨论】:

  • 您似乎试图解释每个值的数据类型(例如字符串 vs 数字 vs 数组...)并将其转换为完美的 javascript 对象。这可能会与正则表达式混淆。我建议寻找不同的方法
  • 有没有办法从源头解决这个问题?是什么产生了这样的字符串?有没有办法生成更常见的对象表示法(JSON、XML、YAML)?
  • 请解释您可以获得哪些其他输入?比如,数组是否可以嵌套,是否存在内部对象、布尔值、科学记数法、十六进制记数法、日期、空值等。请确保完全地描述输入格式的规则。

标签: javascript arrays json regex string


【解决方案1】:

这是一个做出几个假设的解决方案,可能与您的需求不同:

  • 假定键仅为字母字符
  • 具有数字模式的值被假定为数字
  • 分别以[] 开头和结尾的值被假定为包含数字的数组

const str = "{format=svg, width=383, height=480, transform=[40, 40, 40, 40], scaleX=1, scaleY=1}";
const regex = /([a-zA-Z]+)=([[^]]*]|.*?)[,}]/g;
let obj = {};
str.replace(regex, function(m, key, val) {
  if(/^-?d+(.d+)?$/.test(val)) {
    val = Number(val);
  } else if(/^[.*]$/.test(val)) {
    val = val
      .replace(/^[(.*)]$/, '$1')  // get rid of `[` and `]`
      .split(/, */)                 // split on comma and optional space
      .map(num => Number(num));     // convert each item to a number
  }
  obj[key] = val;
  return '';
});
console.log(obj);

输出:

{
  "format": "svg",
  "width": 383,
  "height": 480,
  "transform": [
    40,
    40,
    40,
    40
  ],
  "scaleX": 1,
  "scaleY": 1
}

正则表达式的解释:

  • ([a-zA-Z]+) -- 捕获第一组作为密钥
  • = -- 文字 = 符号
  • ( -- 捕获组 2 的开始值
  • [[^]]*] -- 表示形式为 [...] 的数组的模式
  • | -- 逻​​辑或
  • .*? -- 非贪婪扫描
  • ) -- 捕获组 2 结束以获取值
  • [,}] -- 需要逗号或大括号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多