如何在字符串中使用反斜杠(\)?

68

我试了很多方法,想要从已执行的程序中获得一个单个反斜杠(我不是指来自html输入的内容)。

我可以获取特殊字符,如制表符、换行等,然后转义它们成为\\t或\\n或\\(其他某些字符),但当一个非特殊字符跟在后面时,我无法获得一个单个反斜杠。

我不想要像这样的东西:

str = "\apple";   // I want this, to return:
console.log(str); // \apple

如果我尝试获取索引为0的字符,那么我会得到a而不是\

你的问题是关于字符串还是正则表达式?或者是通过字符串创建的正则表达式(例如,使用 new RegExp(string))? - T.J. Crowder
我尝试了各种方法,包括正则表达式和字符串方法,但似乎在JavaScript代码中没有处理verbatimraw字符串的方法。 - Mik
4个回答

88

(请参见答案末尾的ES2015更新部分。)

你在问题标签中同时标记了stringregex

在JavaScript中,反斜杠在字符串文字和正则表达式中都有特殊含义。如果您想要一个实际的反斜杠,请写两个:\\

以下字符串以一个反斜杠开头,文本中第一个反斜杠是转义字符,表示一个转义序列\\ 转义序列告诉解析器在字符串中放置一个单独的反斜杠:

var str = "\\I have one backslash";
下面的正则表达式将匹配一个单独的反斜杠(不是两个);同样,你在字面值中看到的第一个反斜杠是一个转义字符,开始了一个转义序列。\\ 转义序列告诉解析器在正则表达式模式中放置一个单独的反斜杠字符:
var rex = /\\/;

如果你使用字符串来创建正则表达式(而不是像我上面那样使用正则表达式字面量),请注意你正在处理两个级别:字符串级别和正则表达式级别。所以,为了使用一个字符串创建一个匹配单个反斜杠的正则表达式,你最终会使用四个反斜杠:

// Matches *one* backslash
var rex = new RegExp("\\\\");

这是因为首先,您正在编写一个字符串文字,但实际上想要在生成的字符串中放置反斜杠,因此您需要使用 \\ 来表示每个反斜杠。但是您的正则表达式同样也需要两个\\来表示每一个实际的反斜杠,所以它需要在字符串中看到两个反斜杠。因此,总共需要四个。这是我尽可能避免使用new RegExp(string)的原因之一;我很容易混淆。 :-)

ES2015 和 ES2018 更新

快进到2015年,正如Dolphin_Wood指出的,新的ES2015标准为我们提供了模板字面量、标签函数和String.raw 函数:

// Yes, this unlikely-looking syntax is actually valid ES2015
let str = String.raw`\apple`;

str 最终将包含字符 \, a, p, p, le。请注意在您的模板字面量中没有 ${,因为 ${ 会启动模板字面量中的替换。例如:

let foo = "bar";
let str = String.raw`\apple${foo}`;

最终会变成\applebar


@kev:我不明白这个问题。 - T.J. Crowder
2
@kev:服务器发送的JSON无效。JSON(与JavaScript不同)不容忍未定义的转义序列(\a)。如果这是一个反斜杠,是的,它必须在服务器端进行转义:{"apple":"\\apple"}。(即使JSON容忍无效的转义,您也会想要这样做,因为{"nectarine":"\nectarine"},其中\n是换行符,那么它将是<CR>ectarine。) - T.J. Crowder
1
看起来\12这种限制(\u\x等也有问题)在2016年底之后消失了,所以在现代浏览器中唯一需要避免的就是${ - ShreevatsaR
1
"String.raw" 是我问题的唯一解决方案,谢谢。 - Accountant م
1
String.raw`\`;不起作用,但你可以耍小聪明,使用String.raw`\apple`.replace('apple', '');,这似乎可以解决问题。 - TBG
显示剩余5条评论

24

尝试使用String.raw方法:

str = String.raw`\apple` // "\apple"

参考文献: String.raw()


5
请注意在模板字符串中不要出现 ${,:-) - T.J. Crowder
4
在模板字符串中也不能使用八进制字面量,例如 1\2,因此这并不是一个有效的通用技术来避免反斜杠转义。 - Wyck
String.raw`\`;不起作用,但你可以耍小聪明,使用String.raw`\apple`.replace('apple', '');,这似乎可以解决问题。 - TBG

16

\ 是一个转义字符,当它后面跟着一个非特殊字符时,它不会成为字面上的\。相反,你必须将其加倍为\\

console.log("\apple");  //-> "apple" 
console.log("\\apple"); //-> "\apple" 

无法获取原始的未转义字符串定义或创建没有转义字符的字面字符串。


7
ES6引入了String.raw方法,使得原始字符串的处理成为可能。 - Dolphin_Wood

-3
请尝试下面这个,对我有效,并且输出结果带有反斜杠。
String sss="dfsdf\\dfds";
System.out.println(sss);

3
问题不是关于Java。 - Alex78191

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接