我试了很多方法,想要从已执行的程序中获得一个单个反斜杠(我不是指来自html输入的内容)。
我可以获取特殊字符,如制表符、换行等,然后转义它们成为\\t或\\n或\\(其他某些字符),但当一个非特殊字符跟在后面时,我无法获得一个单个反斜杠。
我不想要像这样的东西:
str = "\apple"; // I want this, to return:
console.log(str); // \apple
如果我尝试获取索引为0的字符,那么我会得到
a
而不是\
。我试了很多方法,想要从已执行的程序中获得一个单个反斜杠(我不是指来自html输入的内容)。
我可以获取特殊字符,如制表符、换行等,然后转义它们成为\\t或\\n或\\(其他某些字符),但当一个非特殊字符跟在后面时,我无法获得一个单个反斜杠。
我不想要像这样的东西:
str = "\apple"; // I want this, to return:
console.log(str); // \apple
a
而不是\
。(请参见答案末尾的ES2015更新部分。)
你在问题标签中同时标记了string
和regex
。
在JavaScript中,反斜杠在字符串文字和正则表达式中都有特殊含义。如果您想要一个实际的反斜杠,请写两个:\\
。
以下字符串以一个反斜杠开头,文本中第一个反斜杠是转义字符,表示一个转义序列。 \\
转义序列告诉解析器在字符串中放置一个单独的反斜杠:
var str = "\\I have one backslash";
下面的正则表达式将匹配一个单独的反斜杠(不是两个);同样,你在字面值中看到的第一个反斜杠是一个转义字符,开始了一个转义序列。\\
转义序列告诉解析器在正则表达式模式中放置一个单独的反斜杠字符:var rex = /\\/;
如果你使用字符串来创建正则表达式(而不是像我上面那样使用正则表达式字面量),请注意你正在处理两个级别:字符串级别和正则表达式级别。所以,为了使用一个字符串创建一个匹配单个反斜杠的正则表达式,你最终会使用四个反斜杠:
// Matches *one* backslash
var rex = new RegExp("\\\\");
这是因为首先,您正在编写一个字符串文字,但实际上想要在生成的字符串中放置反斜杠,因此您需要使用 \\
来表示每个反斜杠。但是您的正则表达式同样也需要两个\\
来表示每一个实际的反斜杠,所以它需要在字符串中看到两个反斜杠。因此,总共需要四个。这是我尽可能避免使用new RegExp(string)
的原因之一;我很容易混淆。 :-)
快进到2015年,正如Dolphin_Wood指出的,新的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
。
\a
)。如果这是一个反斜杠,是的,它必须在服务器端进行转义:{"apple":"\\apple"}
。(即使JSON容忍无效的转义,您也会想要这样做,因为{"nectarine":"\nectarine"}
,其中\n
是换行符,那么它将是<CR>ectarine
。) - T.J. CrowderString.raw`\`;
不起作用,但你可以耍小聪明,使用String.raw`\apple`.replace('apple', '');
,这似乎可以解决问题。 - TBG${
,:-) - T.J. Crowder1\2
,因此这并不是一个有效的通用技术来避免反斜杠转义。 - WyckString.raw`\`;
不起作用,但你可以耍小聪明,使用String.raw`\apple`.replace('apple', '');
,这似乎可以解决问题。 - TBG\
是一个转义字符,当它后面跟着一个非特殊字符时,它不会成为字面上的\
。相反,你必须将其加倍为\\
。
console.log("\apple"); //-> "apple"
console.log("\\apple"); //-> "\apple"
无法获取原始的未转义字符串定义或创建没有转义字符的字面字符串。
String sss="dfsdf\\dfds";
System.out.println(sss);
new RegExp(string)
)? - T.J. Crowder