正则表达式在javascript中的值和键周围添加双引号

时间:2017-06-15 08:35:01

标签: javascript json regex

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

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

但是当我尝试使用JSON.parse时,我收到错误,因为我的字符串应该像

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

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

感谢名单

4 个答案:

答案 0 :(得分:5)

也许你可以使用:

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

以下是

regex demo

注意

在我使用[a-zA-Z0-9-] alphabeticaldigits的字符组-中,您可能需要其他字符,以便您可以使用其他字符

答案 1 :(得分:3)

此功能将在对象末尾添加引号并删除所有多余的逗号

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模块测试了正则表达式

答案 2 :(得分:2)

不带引号的JSON实际上不是有效的JSON。这只是JavaScript。如果您信任该字符串的来源:

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

对于来自不受信任来源的字符串,建议使用 NOT ,因为它可能存在安全风险。

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

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

答案 3 :(得分:1)

美好的一天伊德里斯

如果你想在所有有效的键名和值周围加上引号可能会看一下这个表达式。 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, $&");