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

Posted

技术标签:

【中文标题】正则表达式在javascript中的值和键周围添加双引号【英文标题】:regular expression add double quotes around values and keys in 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恢复的) 【参考方案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, $&");

【讨论】:

感谢您的回答

以上是关于正则表达式在javascript中的值和键周围添加双引号的主要内容,如果未能解决你的问题,请参考以下文章

如何访问存储在scala spark中的数据框中的映射值和键

根据值和键填充 SQL 中的行

用于解析单个键的正则表达式:Javascript 中 JSON 中的值

正则表达式匹配字符周围的字符,正则表达式中的AND运算符?

使用递归函数获取多维php数组的新值和键

JavaScript对象(Object)