先看thinking in java 4th中的一段话:
如果在其他语言中使用过正则表达式,那你就立刻能发现Java对反斜线\的不同处理.在其他语言中,\\表示"我想要在正则表达式中插入一个普通的(字面上的)反斜线,请不要给他任何特殊的意义."而在Java中,\\的意思是"我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义."例如,如果你想表示一位数字,那么正则表达式应该是\\d.如果你想插入一个普通的反斜线,则应该这样用\\\\.不过换行和制表符之类的东西只需使用单反斜线:\n\t.
上面这段话该怎么理解呢?
1.在正则表达式里已经定义了 \d代表数字:[0-9];(这里要说明的是\d里的\是一个普通的\而非转义字符\,) 如果在正则表达式里要表达\d,那么只能用\\d,因为正则表达式是一个字符串类型的东西,如果直接用\d,那么这里\是一个转义字符,所以我们得先把\d中的\转移成普通的\,所以必须再加一个\,即\\d。
2.如果你想插入一个普通的反斜线,则应该这样用\\\\,因为在正则表达式里已经定义了\\代表 反斜线字符,要注意的是这里的\\都是普通的\,而非转义字符,那么如果要想在正则表达式里匹配\,那么只能用\\\\,原因为同时进行了两次转义,由\\转义为\,所以最终为\\.
3.下面我们来看一段代码:
class Demo
{
public static void main(String[] args)
{
System.out.println("a\\b".replaceAll("\","A"));//①
System.out.println("a\\b".replaceAll("②
System.out.println("a\\b".replaceAll("\\\","A"));//③
System.out.println("a\\\\b".replaceAll("\\\\","A"));//④
}
}
首先①:编译失败,因为在字符"\"中,转义字符把"给转移了,所以字符串没有了后面的",所以编译失败。
②:在字符串"\\"中,\\转义为普通\,但是普通的\在正则表达式中没有定义表达具体的意思。所以虽然编译正确,但运行错误。这也验证了thiking in java中的一段话:而在Java中,\\的意思是"我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义."例如,如果你想表示一位数字,那么正则表达式应该是\\d.如果你想插入一个普通的反斜线,则应该这样用\\\\.不过换行和制表符之类的东西只需使用单反斜线:\n\t.
③:和①情况类似。
④:编译运行都正确。
在此十分感激点击打开链接(http://ask.csdn.net/questions/258144)中little_how 的帮助。
欢迎大家对我的分析进行指证,仅供参考。