根据实际的测试和理解,在java字符串中\本来就表示转义字符,它会试图将后面挨着它的任何字符转义,如果转义无指定含义则非法,不能通过编译,比如\.所以在和正则无关的字符串中要表示路径中的分隔符都得用\\
所以要表示正则中特殊含义的\d,要用\先把\转义回来,再加上d,这样就是\\d,所以java的正则表达式中\基本都是成对出现的,因为它在java意义上的字符串中。这可能和php不同,因为php字符串中的正则表达式有专门的两个/来隔离。
所以想要利用正则表达式,用.来分割字符串,就得用\\.表示这个正则表达式。因为.在正则表达式中代表任意字符,要想表达.就要在正则意义上转义,而如果表示成\.则编译提示:非法转义符,因为这是在java意义上企图将.转义,而对应的意义是不存在的。所以要先在java意义上将\转义,即\\,然后在正则意义上转义.,即\\.,编译通过,切割正确:
例子:
public static void splitDemo(String str,String reg)
{
String[] arr=str.split(reg);
for(String s:arr)
{
System.out.println(s);
}
}
String str1="zhangsan.lisi.wangwu";
String reg1="\\.";//直接用.不行,代表正则表达式的任意字符,用\.则是(在java意义上)转义了.无意义(非法),所以用\转义一下\(变成正则意义上的转义字符?),所以用\\.表示用.切割!
splitDemo(str1,reg1);
结果:
zhangsan
lisi
wangwu
关于这个问题的其他网友解答(引用,特此感谢):