如何仅为键解析javascript对象的字符串(无效JSON)

如何仅为键解析javascript对象的字符串(无效JSON),javascript,regex,json,Javascript,Regex,Json,我正在尝试将JS对象的字符串转换为有效的json。这涉及到在键中添加引号 这项工作: /([\w]+)(:)/g (我实际上是用replace来做这件事的) 除了它匹配任何在值中包含:的单词之外 例如: "{ key1: "Value 1", key2: "http://dummyimage.com/600x400/7190d6/fff.png" }" 这与key1:、key2和http: 我只想匹配key1:和key2 当然,如果已经回答了,我很抱歉。我已经找了很长一段时间了,

我正在尝试将JS对象的字符串转换为有效的json。这涉及到在键中添加引号

这项工作:

/([\w]+)(:)/g
(我实际上是用replace来做这件事的)

除了它匹配任何在值中包含
的单词之外

例如:

"{ 
  key1: "Value 1",
  key2: "http://dummyimage.com/600x400/7190d6/fff.png"
 }"
这与
key1:
key2
http:

我只想匹配
key1:
key2

当然,如果已经回答了,我很抱歉。我已经找了很长一段时间了,但没有结果


如果我能在第一时间使用有效的JSON,那当然很好,但不幸的是,这超出了我的控制范围。

一种方法是使用积极的前瞻。例如:

"{ key1: {-1.2},\r\n key2: \"http://dummyimage.com/600x400/7190d6/fff.png\", key3: '3', key4: true }".match(/(\w+)(:)\s*(?='|"|[0-9+\-.]+|true|false|\[|{)/gi);

在本例中,它仅将一个单词与“:”(一个可能的空格)匹配,然后在接受它之前将下一个字符视为引号、值、数组括号或对象括号。当然,并非在所有情况下都是万无一失的。

实现这一点的最简单方法可能是使用
eval
,但使用此函数在安全性、性能和可调试性方面有很多影响


我相信这是因为你们正在全球范围内进行替换。由于“keyX:”是字符串的第一部分,也是您要替换的部分,请尝试:

str.replace((/([\w]+)(:)), "\"$1\"$2")

您选择的变量名有点令人恼火。这与JSON无关。(我担心这会让未来不太熟悉这个话题的读者感到困惑)我理解你的观点@FelixKling,你建议变量名是什么?不幸的是,我没有好的选择<代码>数据和
obj
浮现在脑海中,但它们只是稍微好一点;)我想如果我们知道这些数据是关于什么的,我们可以想出更好的答案。这可能是一个不错的答案,假设输入来自一个安全的来源,并且根本不修改外部状态。不幸的是,我们不知道情况是否如此做什么?谢谢,这让我更接近了。不幸的是,这也不行,因为值可能是其他对象或数组。谢谢!以下是我如何调整它的:<代码>(<代码>(\w)5 5(w)5(w)5(以下::)\s*(s)s*(;;;;;;;(0-9-9 9+-够够近了我够近了我够近了我够近了我够近了:这里是我怎么做的我是我如何调整它的:<代码><代码>(以下以下以下以下以下以下是我是我是我是我是我是我是我是我是我是我的我的,我是我是怎么做的::::::::::::<代码>我是我做了我是我是我是我是我是我是我是我是我是我是怎么做了我是我是我是我的调整的::::::::::<代码><代码><代码><代码>(<代码><代码><代码>(<代码>(<代码>[我是我是我是我是我;\[\{)/gi,“\”$1\“$2”);对不起,您添加了缺少的“/”了吗?
var json = '{key1: "Value 1", key2: "http://dummyimage.com/600x400/7190d6/fff.png"}';
eval('var jsonObject = ' + json);
json = JSON.stringify(jsonObject);
console.log(json);
str.replace((/([\w]+)(:)), "\"$1\"$2")