关于java中正则表达式\\和\\\\的理解?请各位高手帮忙分析下。
问题描述:
1.下面是jdk API中的原话:根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。 这段话怎么理解?
2.这是thinking中的一段话:如果在其他语言中使用过正则表达式,那你就立刻能发现Java对反斜线\的不同处理.在其他语言中,\\表示"我想要在正则表达式中插入一个普通的(字面上的)反斜线,请不要给他任何特殊的意义."而在Java中,\\的意思是"我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义."例如,如果你想表示一位数字,那么正则表达式应该是\\d.如果你想插入一个普通的反斜线,则应该这样用\\\\.不过换行和制表符之类的东西只需使用单反斜线:\n\t. 怎么理解?
3.看一下代码:
class Demo
{
public static void main(String[] args)
{
System.out.println("a\\b".replaceAll("\","A"));//①
System.out.println("a\\b".replaceAll("\\","A"));//②
System.out.println("a\\b".replaceAll("\\\","A"));//③
System.out.println("a\\\\b".replaceAll("\\\\","A"));//④
System.out.println("a\\\\\\b".replaceAll("\\\\","A"));//⑤
}
}
上面①到③为啥编译或者运行失败?④⑤却运行成功?求解释。
4.字符串中的\是转移字符,那么在正则表达式中的\\和\\\\又该怎么理解呢?
答
1.java的转意字符为\,拥有字符转意的是\ " b t n r等;
2.replaceAll调用的是模式,所以为用正则的模式来做替换;
3.正则里面又有转意的元字符,如\S表示非空格,\s表示空格, \w \d等各自的一些表示。
以上3点结合起来就是,想要\在java中存在,那么必须要转意 如\b在java属于转意,那么在正则的时候拿到的模式就是转意后的,
所以想要正则的模式拿到目标的,那么需要对\进行转意,那么转意后的\在java中就不会对\b继续进行转意,那么该模式就为正则
模式串了。
不理解的可以继续提问。
答
这里\\b对于正则表达式来说是\b,\b表示匹配单词的边界 \\\\b是\\b,此时b就是b,\\表示字面的斜杠。
答
首先,字符串的反斜杠本身就有着特殊的含义,即转义,凡是有有特殊含义的字符如\t,\n\b等,如果要原样使用这些特殊字符即不让计算机将其视为特殊字符而是普通表面的字符串,那么就需要转义。
答
java中///专业字符