为什么String.replace中的这个RegExp会删除我的反斜杠?

时间:2017-05-23 21:37:45

标签: javascript regex escaping

假设我有这个字符串

"examples\output\$projectname$\$projectname$.csproj"

我想用一些字符串替换$ projectname $的所有出现。例如。用TEST替换它应该产生:

"examples\output\TEST\TEST.csproj"

我最接近实现这一目标的是:

("examples\output\$projectname$\$projectname$.csproj")
    .replace(new RegExp("\\$projectname\\$", "g"), "TEST");

产生:

"examplesoutputTESTTEST.csproj"

即使写作......

("examples\output\$projectname$\$projectname$.csproj")
    .replace(new RegExp("output", "g"), "TEST");

...这仍将删除反斜杠

"examplesTEST$projectname$$projectname$.csproj"

为什么会发生这种情况?如何防止这种情况发生?

2 个答案:

答案 0 :(得分:2)

首先,反斜杠并不存在:

// Prints "examplesoutput$projectname$$projectname$.csproj":
console.log("examples\output\$projectname$\$projectname$.csproj");

您需要转义给定字符串文字中的反斜杠。字符串文字"\$"将评估为"$"。但字符串文字"\\$"将评估为"\$"

var path = "examples\\output\\$projectname$\\$projectname$.csproj".replace(new RegExp("\\$projectname\\$", "g"), "TEST");

console.log(path); // "examples\output\TEST\TEST.csproj"

答案 1 :(得分:2)

在JavaScript中(与许多其他语言一样),文字字符串中的反斜杠充当转义字符,保留后面的字符;效果是斜线消失了。这意味着您的字符串写为:

"examples\output\$projectname$\$projectname$.csproj"

被解释为,

"examplesoutput$projectname$$projectname$.csproj"

您需要使用反斜杠来逃避反斜杠:

"examples\\output\\$projectname$\\$projectname$.csproj"

请注意,如果您的字符串中包含单个反斜杠(例如,从返回Windows文件路径的API),则反斜杠已经是字符串的一部分,因此不需要处理逃避现有的斜杠。

回到原始代码,您无需创建新的RegExp对象。 Javascript支持正则表达式文字。所以你可以写:

"examples\\output\\$projectname$\\$projectname$.csproj"
.replace(/\$projectname\$/g, "TEST")