【问题标题】:Remove double quotes from object properties unless start with number从对象属性中删除双引号,除非以数字开头
【发布时间】:2020-02-11 06:42:01
【问题描述】:

我已经用谷歌搜索并完成了堆栈溢出问答,但没有找到这个确切的场景。我有一个像这样的对象:

props: {
  "label": "1rem",
  "text3": "1rem",
  "text2Button": "1rem",
  "1": "1rem",
  "5spacing": 2
}

我正在使用此正则表达式模式来捕获对象属性名称并删除基于 simplified version of another answer 的双引号:

/"([^"]+)":/g

这很好用,但我希望数字保留双引号,所以我将其更改为:

/"([^"0-9]+)":/g

但是,这仅匹配 "label" 并且任何带有数字的属性都被排除在外。我明白为什么会发生这种情况,但我不知道如何匹配其中包含数字的属性,但排除那些 以数字开头的属性。

所需的正则表达式模式将匹配 "label"、"text3" 和 "text2Button",这样我就可以将对象转换为:

props: {
  label: "1rem",
  text3: "1rem",
  text2Button: "1rem",
  "1": "1rem",
  "5spacing": 2
}

(我不知道如何将排除 ^ 与字符串 ^ 的开头结合起来。我也不知道添加 | 运算符的正确位置,或者如果那甚至是正确的方法。)

【问题讨论】:

  • 有什么理由使用正则表达式来解析 JavaScript 中的 JSON 吗? JSON 中的键也应该是字符串。
  • 这是在 JSON 被解析为字符串后应用的。最终结果不是 JSON。
  • 为什么不直接使用:let obj = JSON.parse(str);初始化你的对象?
  • 另外 parseInt(str) 将产生“NaN”,除非字符串 (str) 以数字开头,所以我相信另一个选择是检查 !!parseInt(property) 的真实性,因为 NaN 是假的。

标签: javascript json regex


【解决方案1】:

您的模式不起作用,因为[^"0-9]+ 要求所有字符既不是" 也不是数字,而您只想确保第一个字符不是数字。

您可以使用以下模式:

/"([^0-9][^"]*)":/g

Demo.

【讨论】:

    【解决方案2】:

    使用这个正则表达式: 正则表达式:

    \"([a-zA-Z]\w*)\"(?=:)
    

    演示: Here

    【讨论】:

    • 请注意,这将不匹配 "a":。您应该将\w+ 替换为\w*。
    • 谢谢!这个也可以(上面提到的单一属性名称例外)。我很欣赏这张图。我将接受另一个答案,因为它更接近于告诉排除而不是包含什么的原始模式。
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 2016-02-15
    • 2018-05-10
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多