我真的很困惑如何逃避。有时候我只需要加一个反斜杠,但有时我需要加上像"\\."
这样的双反斜杠。
有谁可以告诉我为什么?
另外,任何人都可以给我一个差异的解释
String.split("\t")
,String.split("\\t")
,String.split("\\\t")
,String.split("\\\\t")
? 答案 0 :(得分:3)
反斜杠是字符串文字中的特殊字符 - 我们可以使用它来创建\n
或像"
一样转义\"
。
但反斜杠在正则表达式引擎中也很特殊 - 例如我们可以使用它来使用默认字符类,如\w
\d
\s
。
因此,如果您要创建代表正则表达式/文本的字符串,例如\w
,则需要将其写为"\\w"
。
如果要编写代表\
文字的正则表达式,则表示此类正则表达式的文本需要看起来像\\
,这意味着表示此类文本的字符串需要写为"\\\\"
。<登记/>
换句话说,我们需要两次反斜杠:
- 一次进入正则表达式\\
- 一次在字符串"\\\\"
中。
如果你想传递给代表制表符的正则表达式引擎文字,那么你根本不需要反斜杠。 Java会将"\t"
字符串理解为表示制表符字符的字符串,您可以将此字符串传递给正则表达式引擎而不会出现问题。
对于我们在Java中的舒适正则表达式引擎,解释代表\t
(也是\r
和\n
)的文本与字符串文字解释"\t"
的方式相同。换句话说,我们可以传递给代表\
字符和t
字符的正则表达式引擎文本,并确保它将被解释为制表符的表示。
因此split("\t")
或split("\\t")
等代码会尝试在标签上进行拆分。
split("\\\\t")
之类的代码会尝试拆分不在制表符上的文字,而是在\
字符后跟t
。之所以会发生这种情况,是因为"\\\\"
代表了正则表达式\\
,正则表达式引擎将其视为已转义\
(因此将其视为文字)。