在保持 JSON 文件完整的同时替换 Javascript 中的字符串

Posted

技术标签:

【中文标题】在保持 JSON 文件完整的同时替换 Javascript 中的字符串【英文标题】:Replacing a string in Javascript while keeping JSON file intact 【发布时间】:2019-02-18 18:50:54 【问题描述】:

我正在使用 Discord 机器人,并且有一个名为 config.json 的 JSON 文件,如下所示:


"token": "stuff"
"prefix": "!"

我想替换“前缀:”!”行。我的代码是这样的:

if(cmd == "prefix")
    var new_prefix = "\"prefix\": " + "\"" + String(args[0]) + "\"";
    var data = fs.readFileSync("config.json", "utf-8");
    var newValue = data.replace(/"prefix"\s*:\s*".+"/gm, "new_prefix");
    fs.writeFileSync("config.json", new_prefix, "utf-8");
;

它不只是替换一行,而是覆盖了我的整个 config.JSON 文件,所以之后它看起来像这样:

"prefix":"stuffHere"

我怎样才能让它只替换一行并保持文件的其余部分完好无损?

【问题讨论】:

【参考方案1】:

不要为此使用正则表达式,这会使事情变得比需要的复杂得多。使用JSON.parse将JSON字符串转为对象,赋值给对象上的prefix属性,然后写入字符串化对象:

if(cmd == "prefix")
    var dataJSON = fs.readFileSync("config.json", "utf-8");
    var data = JSON.parse(dataJSON);
    data.prefix = "new_prefix";
    fs.writeFileSync("config.json", JSON.stringify(data), "utf-8");

如果您不得不为此使用正则表达式,无论出于何种原因,您都必须将"prefix": "<oldvalue>" 替换为不仅是新值,还包括前缀属性。匹配值时(以 " 开头),如果字符串也不包含双引号,则延迟重复任何字符,直到找到另一个 "

.replace(/"prefix": *".*?"/, '"prefix": "new prefix"')

https://regex101.com/r/zyhPqG/1

【讨论】:

因此,当我实施您的解决方案时,它将前缀更改为“new_prefix”,而不是我分配的前缀。我尝试删除它周围的引号 data.prefix = new_prefix;这也不起作用。 更新:实际上它确实有效,我只需要删除引号并更新 var new_prefix = args[0];现在我的问题是让 DIScord 机器人更新 JSON 文件中的前缀,可能会以某种方式关闭并重新打开文件。但这可能超出了这个问题的范围。

以上是关于在保持 JSON 文件完整的同时替换 Javascript 中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl,如何在保持参照完整性的同时从单个表加载多个表?

如何在保持大小写的同时替换单词?

在保持数据完整性的同时对循环依赖进行建模

使用jQuery在输入框中显示一个小数点后2位的值,同时保持更高的精度[重复]

在保持二级索引完整的同时对多索引数据框中的行进行排序

替换 EAV 时 JSON(B) 中的数据完整性