【问题标题】:Replacing a string in Javascript while keeping JSON file intact在保持 JSON 文件完整的同时替换 Javascript 中的字符串
【发布时间】: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"

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

【问题讨论】:

    标签: javascript string replace discord.js


    【解决方案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 文件中的前缀,可能会以某种方式关闭并重新打开文件。但这可能超出了这个问题的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2018-05-04
    • 2018-11-09
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多