(请参阅答案末尾的 ES2015 更新。)
您已将您的问题标记为 string 和 regex。
在 JavaScript 中,反斜杠在字符串文字和正则表达式中都有特殊的含义。如果您想在字符串或正则表达式中使用实际的反斜杠,则必须写两个:\\。
这个字符串以 one 反斜杠开头,你在文字中看到的第一个是一个转义字符,告诉我们从字面上获取下一个字符:
var str = "\\I have one backslash";
这个正则表达式将匹配一个单个反斜杠(不是两个);同样,您在文字中看到的第一个是转义字符,告诉我们从字面上获取下一个字符:
var rex = /\\/;
如果您使用字符串来创建正则表达式(而不是像我上面所做的那样使用正则表达式文字),请注意您正在处理两个级别:字符串级别和正则表达式级别。因此,要使用匹配单个反斜杠的字符串创建正则表达式,您最终需要使用 four:
// Matches *one* backslash
var rex = new RegExp("\\\\");
那是因为首先,您正在编写一个字符串文字,但您实际上想在其中放置反斜杠。因此,您可以使用\\ 为您想要的每个反斜杠执行此操作。但是您的正则表达式 also 需要两个 \\ 来表示您想要的每个真正的反斜杠,因此它需要在字符串中看到两个反斜杠。因此,一共有四个。这是我尽可能避免使用new RegExp(string) 的原因之一;我很容易混淆。 :-)
ES2015 和 ES2018 更新
快进到 2015 年,as Dolphin_Wood points out 新的 ES2015 标准为我们提供了模板文字、标签函数和 String.raw 函数:
// Yes, this unlikely-looking syntax is actually valid ES2015
let str = String.raw`\apple`;
str 最终包含字符 \、a、p、p、l 和 e。请注意,您的“字符串”(模板)中没有 ${,因为这是一个模板文字,${ 开始替换。例如:
let foo = "bar";
let str = String.raw`\apple${foo}`;
...最终成为\applebar。 更新: 自 ES2018 起,以下内容不再适用,它更新了模板文字以允许无效的转义序列,详情 here。 还请注意,这与 C# 或类似中的“逐字”字符串不太一样,因为不允许与规范中的 LegacyOctalEscapeSequence 匹配的序列,并导致语法错误。比如
// Fails
let str = String.raw`c:\foo\12\bar`;
...失败,因为 \12 看起来像旧的八进制文字。