fs.writeFileSync不会写入字符串与转义反斜杠
问题描述:
在我的程序中,我试图编写一个字符串来表示一个正则表达式,就像写入一个文件一样。这意味着保留发生在字符串中的任何反斜杠。但是,当我尝试将此字符串写入文件时,每对反斜杠的反斜杠比它应该少一个。fs.writeFileSync不会写入字符串与转义反斜杠
我的例子来说明这个问题是像这样:
let filepath = path.join(__dirname, 'output.js');
let outputString = "\\d{3}(-|\\s)?\\d{3}(-|\\s)?\\d{4}";
fs.writeFileSync(filepath, outputString, 'utf-8');
输出结果是:
\d{3}(-|\s)?\d{3}(-|\s)?\d{4}
是有一些选择,我可以传递给fs.writeFileSync
保持字符串中的所有字符写入文件?
我意识到一个解决方案可能涉及逃避所有可能的字符在这个字符串像js-string-escape库,但由于这些特定的字符串代表的正则表达式是不是真的安全这样做?我不想以任何方式改变它们或它们的功能。
说明:我意识到这个输出并不是真正有效的JavaScript,但它是我真正想要做的一个有点人为的例子。这个小小的代码片段恰好证明了这个问题。
答
如果要在outputString中使用两个反斜杠,则需要四个反斜杠。 例:
let filepath = path.join(__dirname, 'output.js');
let outputString = "\\\\d{3}(-|\\\\s)?\\\\d{3}(-|\\\\s)?\\\\d{4}";
fs.writeFileSync(filepath, outputString, 'utf-8');
输出的结果将是:
\\d{3}(-|\\s)?\\d{3}(-|\\s)?\\d{4}
一个反斜杠跳过后续反斜杠...
它是维护所有反斜线了。你的字符串'outputString'在任何时候都有双反斜线:当JavaScript解析字符串常量时,这些字符串被移除,留下单个反斜杠。 – Pointy
与你的问题没有任何关系,但我会高度建议不要使用writeFileSync。如果您获得大量流量,它可以完全锁定您的整个应用程序。真的,它只适用于应用程序引导过程。 – dvsoukup