在保持 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,如何在保持参照完整性的同时从单个表加载多个表?