【问题标题】:regular expression add double quotes around values and keys in javascript正则表达式在javascript中的值和键周围添加双引号
【发布时间】:2017-11-17 15:50:46
【问题描述】:

我需要一个有效的 JSON 格式来请求 ES。 我有一个像

这样的字符串
{ 
time:  { 
          from:now-60d,
          mode:quick,
          to:now } 
}

但是当我尝试使用 JSON.parse 时出现错误,因为我的字符串应该是这样的

 { 
time:  { 
          "from":"now-60d",
          "mode":"quick",
          "to":"now" } 
}

所以我的问题是,有什么解决方案可以在我的字符串的键和值周围添加双引号?

感谢

【问题讨论】:

  • 为什么不先生成一个对象,从数据中渲染一个真正的JSON字符串呢?
  • 问题是字符串是kibana自动生成的(我是通过url恢复的)

标签: javascript json regex


【解决方案1】:

也许你可以使用:

str.replace(/([a-zA-Z0-9-]+):([a-zA-Z0-9-]+)/g, "\"$1\":\"$2\"");

这里是

regex demo


注意

[a-zA-Z0-9-] 的字符组中,我使用alphabetical digits-,也许你需要其他的,所以你可以使用另一个

【讨论】:

  • 不客气。还有@IdrissBenbassou - 如果这对你有帮助(它显然做了;),你不应该投票(答案左侧的向上箭头)吗?它使其他有类似问题的人更容易找到一个好的答案。
  • 如何在 bash 中做到这一点?
  • 嗨 @Tanzeel 抱歉,我不熟悉 bash,但您可以提出问题,我相信您会在几分钟内得到答案 :)
  • 工作正常,你应该在你的正则表达式中添加“_”字符。
  • 嗨@YCF_L,如果值中有 , ,这有些方法不起作用。关于如何处理这些的任何想法?
【解决方案2】:

此函数将在对象末尾添加引号并删除任何多余的逗号

function normalizeJson(str){return str.replace(/"?([\w_\- ]+)"?\s*?:\s*?"?(.*?)"?\s*?([,}\]])/gsi, (str, index, item, end) => '"'+index.replace(/"/gsi, '').trim()+'":"'+item.replace(/"/gsi, '').trim()+'"'+end).replace(/,\s*?([}\]])/gsi, '$1');}

编辑:

这个其他函数支持 json 数组。

它还可以将单引号转换为双引号,并且不使用数字和布尔值的引号。

function normalizeJson(str){
    return str.replace(/[\s\n\r\t]/gs, '').replace(/,([}\]])/gs, '$1')
    .replace(/([,{\[]|)(?:("|'|)([\w_\- ]+)\2:|)("|'|)(.*?)\4([,}\]])/gs, (str, start, q1, index, q2, item, end) => {
        item = item.replace(/"/gsi, '').trim();
        if(index){index = '"'+index.replace(/"/gsi, '').trim()+'"';}
        if(!item.match(/^[0-9]+(\.[0-9]+|)$/) && !['true','false'].includes(item)){item = '"'+item+'"';}
        if(index){return start+index+':'+item+end;}
        return start+item+end;
    });
}

我还使用safe-regex npm 模块测试了正则表达式

【讨论】:

  • 不幸的是,答案很好。第一个解决方案是弄乱值中的逗号,例如 => {test : "1,000.00"},值中的逗号在标准化后被删除。第二种解决方案去掉了值 {test: "2020/11/19 16:11:46" } 中的空格
【解决方案3】:

未引用的 JSON 并不是真正有效的 JSON。它只是 JavaScript。如果您信任此字符串的来源:

var obj = eval("'({ 
time:  { 
      from:now-60d,
      mode:quick,
      to:now } 
 })'");

对于来自不受信任来源的字符串,建议这样做,因为这可能存在安全风险。

鉴于您从 Kibana 获取可能可信的数据,应该可以评估字符串。

另一种选择是使用正则表达式,可能由其他答案详细说明。或者,您可能希望修复 Kibana 导出以提供正确/有效的 JSON 字符串。

【讨论】:

  • 感谢您的回答
【解决方案4】:

伊德里斯早安

如果你想在所有有效的键名和值周围加上引号,可以看看这个表达式。 YCF_L 的答案完全符合您的要求。 但这里还是有的。

{(?=[a-z])|[a-z](?=:)|:(?=[a-z])|[a-z](?=,)|,(?=[a-z])|[a-z](?=})
str.replace(/{(?=[a-z])|[a-z](?=:)|:(?=[a-z])|[a-z](?=,)|,(?=[a-z])|[a-z](?
=})/igm, $&");

【讨论】:

  • 感谢您的回答
猜你喜欢
  • 2011-06-18
  • 2017-01-30
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2011-09-15
  • 2013-10-20
相关资源
最近更新 更多