html
的输入)。 我可以使用特殊字符作为制表符,换行符和许多其他字符,然后将它们转义到
\t
或\n
或\(someother character)
,但是当非特殊字符旁边时,我无法获得单个反斜线。 我不想要这样的东西:
str = "\apple"; // I want this, to return:
console.log(str); // \apple
,如果我尝试在0处获取字符,则会得到
a
而不是\
。 #1 楼
(请参见答案末尾的ES2015更新。)您已标记问题
string
和regex
。在JavaScript中,反斜杠在字符串中均具有特殊含义文字和正则表达式。如果要在字符串或正则表达式中使用实际的反斜杠,则必须编写两个:
\
。此字符串以一个反斜杠开头,您在文字中看到的第一个反斜杠字符告诉我们从字面上取下一个字符:
var str = "\I have one backslash";
此正则表达式将匹配一个反斜杠(不是两个);再次,您在文字中看到的第一个字符是转义字符,告诉我们以文字形式获取下一个字符:
var rex = /\/;
如果您使用字符串来创建正则表达式(而不是像我上面那样使用正则表达式文字),请注意,您要处理两个级别:字符串级别和正则表达式级别。因此,要使用与单个反斜杠匹配的字符串来创建正则表达式,您将最终使用四个:
// Matches *one* backslash
var rex = new RegExp("\\");
,这是因为首先要编写字符串文字,但您实际上想在其中添加反斜杠。因此,您可以对每个想要的反斜杠使用
\
来实现。但是您的正则表达式还需要为每个所需的每个真实反斜杠添加两个\
,因此它需要在字符串中看到两个反斜杠。因此,总共四个。这是我尽可能避免使用new RegExp(string)
的原因之一;我很容易困惑。 :-) ES2015更新
快进到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
。还要注意,这不太像C#或类似形式的“ verbatim”字符串,因为不允许与规范中的LegacyOctalEscapeSequence相匹配的序列,并且会导致语法错误。例如,// Fails
let str = String.raw`c:\foo\bar`;
...失败,因为
看起来像旧的八进制文字。评论
如果已经分配了带有反斜杠的变量,您如何用console.log()进行分配(因为它像从服务器那样返回了)?
–kev
17年1月16日在3:30
@kev:我不明白这个问题。
– T.J.拥挤者
17年1月16日在6:59
$ .ajax({})。done(function(data){console.log(data)})输出:对象{apple:“ apple”},但服务器实际发送:{“ apple”:“ \ apple”}。是否需要在服务器上进行转义还是有一个纯粹的客户端解决方案?
–kev
17年1月17日,0:13
@kev:服务器发送的内容是无效的JSON。 JSON(与JavaScript不同)不容许未定义的转义序列(\ a)。如果是反斜杠,是的,必须在服务器端转义:{“ apple”:“ \\ apple”}。 (由于{“ nectarine”:“ \ nectarine”},即使JSON允许无效的转义,您也要使用
– T.J.拥挤者
17年1月17日在7:36
看起来\ 12种限制(\ u,\ x等也存在问题)在2016年底后的某个时候消失了,因此在现代浏览器中,唯一需要避免的是$ {
–ShreevatsaR
18年2月13日在21:41
#2 楼
\
是转义字符,后跟非特殊字符时,不会变成文字\
。相反,您必须将其加倍\
。console.log("\apple"); //-> "apple"
console.log("\apple"); //-> "\apple"
无法获取原始的原始字符串定义或创建不带转义字符的文字字符串。
评论
通过es6 String.raw方法可以使用原始字符串
–Dolphin_Wood
2015年6月10日下午6:42
#3 楼
尝试String.raw
方法:str = String.raw`\apple` // "\apple"
参考此处:String.raw()
评论
请注意,模板文字中的任何地方都没有$ {。 :-)
– T.J.拥挤者
16年1月9日,11:28
而且模板字符串中也不能包含八进制文字,例如1 \ 2,因此,这实际上不是避免反斜杠转义的有效通用技术。
–维克
16年8月25日在14:56
评论
您是关于字符串还是正则表达式的问题?还是您正在通过字符串创建的正则表达式(例如,使用新的RegExp(string))?我尝试了各种方式,无论是正则表达式还是字符串方法,但实际上似乎没有办法在JavaScript代码中处理逐字或原始字符串。