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

Posted

技术标签:

【中文标题】如何在字符串中使用反斜杠 (\\)?【英文标题】:How can I use backslashes (\) in a string?如何在字符串中使用反斜杠 (\)? 【发布时间】:2012-04-19 23:36:38 【问题描述】:

我尝试了多种方法从执行(我不是指来自html 的输入)中获取单个反斜杠

我可以将 特殊字符 作为制表符、换行符和许多其他字符,然后将它们转义为 \\t\\n\\(someother character) 但当 非特殊字符在它旁边。

我不想要这样的东西:

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

如果我尝试在 0 处获取字符,那么我会得到 a 而不是 \

【问题讨论】:

您的问题是关于字符串还是正则表达式?还是您通过字符串创建的正则表达式(例如,使用new RegExp(string))? 我尝试了各种方法,无论是正则表达式还是字符串方法,但似乎没有办法处理 verbatimraw 字符串javascript 代码。 【参考方案1】:

(请参阅答案末尾的 ES2015 更新。)

您已将您的问题标记为 stringregex

在 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 最终包含字符 \apple。请注意,您的“字符串”(模板)中没有 $,因为这是一个模板文字,$ 开始替换。例如:

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

...最终成为\applebar更新: 自 ES2018 起,以下内容不再适用,它更新了模板文字以允许无效的转义序列,详情 here。 还请注意,这与 C# 或类似中的“逐字”字符串不太一样,因为不允许与规范中的 LegacyOctalEscapeSequence 匹配的序列,并导致语法错误。比如

// Fails
let str = String.raw`c:\foo\12\bar`;

...失败,因为 \12 看起来像旧的八进制文字。

【讨论】:

如果已经分配了带有反斜杠的变量(因为它是从服务器返回的),你如何控制台.log()? @kev:我不明白这个问题。 @kev:服务器发送的是无效的 JSON。 JSON(与 JavaScript 不同)不允许未定义的转义序列 (\a)。如果这意味着反斜杠,是的,它必须在服务器端转义:"apple":"\\apple"。 (即使 JSON 允许无效的转义,您也希望这样做,因为 "nectarine":"\nectarine",其中 <CR>ectarine 因为\n 是换行符。) 看起来\12 类型的限制(\u\x 等也存在问题)有时会消失 after late 2016,所以在现代浏览器中唯一要避免的事情是$ String.raw 是我的问题的唯一解决方案,谢谢。【参考方案2】:

试试String.raw方法:

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

参考这里:String.raw()

【讨论】:

请注意模板文字中的任何地方都没有$。 :-) 而且你不能在模板字符串中使用八进制文字,例如1\2,所以这并不是一种有效的避免反斜杠转义的通用技术。【参考方案3】:

\ 是一个转义字符,当后面跟着一个非特殊字符时,它不会变成文字 \。相反,您必须将其翻倍 \\

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

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

【讨论】:

原始字符串通过 es6 String.raw 方法成为可能【参考方案4】:

请尝试以下对我有用的方法,我会得到带有反斜杠的输出

String sss="dfsdf\\dfds";
System.out.println(sss);

【讨论】:

问题与 Java 无关。

以上是关于如何在字符串中使用反斜杠 (\)?的主要内容,如果未能解决你的问题,请参考以下文章

python 如何快速转义路径字符串中的斜杠

如何使用redshift从字符串中删除反斜杠?

sed命令反斜杠的转义

如何去掉Json字符串中反斜杠

为啥JSON字符串当中会出现反斜杠?

如何使用单个反斜杠转义字符串的特殊字符