正则表达式在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中的数据框中的映射值和键