1.反斜线 ‘\ ’

\ ‘不理解而产生不必要的错误,这个字符在 Java

引用 :反斜线 用于引用其他将被解释为非转义构造的转义字符 ,这话的确很拗口,仔细分析其实是不难理解的,比如想要声明一个内容为一对英文符号的双引号的字符串,也就是 ””

String str = “”””;
Java
 String str = “\”\””;

” 在 JVM 中被认作为字符串的声明符号类似于操作运算符,而前面加上一个反斜线 \ 就是告诉 JVM我要双引号的文本意思(也就是上面那句话中的 解释为非转义构造

转义 :反斜线同时也可以用于引用转义构造,举一个最简单的例子, n 原本没有任何其他意思,也就是非转义字符,而前面加上 \ ,变为 \n 就代表一个换行符,这时反斜线就把 n “转义“了,注意这里的 \n 是事先声明过的,如果来一个 \v 在编译时就会报错。在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否是非转义构造的一部分。当然如果要解释非转义的其本身,可以这样 \\



2.正则表达式中匹配一个“\”,需要在表达式中写4个"\\\\"。

因为对于编译器而言,\表示转义,并且这样的字符串必须先被编译器“阅读”一遍,例如:


"\\\\"编译器阅读后变成了"\\","\\"再由正则表达式阅读,显然正则表达式中"\\"表示\ 

"\\d"编译器阅读后变成了"\d","\d"再由正则表达式阅读。

3.实例


public static void main(String[] args) {
		String str="欢迎\t欢迎";
		System.out.println(str.replaceAll("\\\t",""));
		System.out.println(str.replaceAll("\\t", ""));
		System.out.println(str.replaceAll("\t", ""));
		System.out.println(str.replaceAll("\\\\t", ""));
	}



输出结果:


欢迎欢迎
欢迎欢迎
欢迎欢迎
欢迎	欢迎



看起来明显输入的正则表达式不同,但是输出结果都一样(制表符被替换)。随后去查了下Pattern的Doc,发现下面一段话:

It is an error to use a backslash prior to any alphabetic character that does not denote an escaped construct; these are reserved for future extensions to the regular-expression language. A backslash may be used prior to a non-alphabetic character regardless of whether that character is part of an unescaped construct.

其大意是,一个反斜线可以放在任何一个非字母之前而无论这个字符是否是一个可以escaped的字符。(经过测试发现,如果反斜线后面跟着一个非字母字符的时候是不起任何作用的,跟不加反斜线的效果一样)

那么回头来看这个问题,由于\在Java中是转义符,所以出现有\的地方我们先做一个转换如下,左边是原始输入,右边是转义以后的字符串数组(数组的形式更方便区分):

  • \t -> {\t}
  • \ \t -> {\,t}
  • \ \ \t -> {\, \t}
  • \ \ \ \t -> {\,\,t} (增加了这个选项以便看到输出和其他三个的区别)

第一个就是制表符,会被替换掉。 
第二个转义以后虽然不是制表符,但是从字面上看来也是制表符,所以正则替换的时候也被替换掉了。 
第三个转义以后是一个\和一个制表符,根据前面看到的JavaDoc提到的内容。制表符是一个非字母字符,所以这个用法其实就是表示一个制表符(你也可以把 \t 换成 \你 看看输出结果)。 
第四个转义以后是\,\和t三个字符,是不满足替换条件的。