java正则表达式陷阱

直接看代码:

publicclass StringSplit{
    publicstaticvoid  mian(String [] args){
       String str = "java.ix?sdcc.dddd";
           //将这个字符串以点好(.)分隔成多个字符
           String[] strArr = str.split(".");
           for(String s : strArr){
              System.out.println(s);
           }
    }  
}

上面程序非常简单,提供了一个包含多个点号(.)的字符串,接着调用String提供的Split()方法,以点号(.)作为分隔符来分隔这个字符串,希望返回该字符串被分割后得到的字符串数组。运行改程序,结果发现程序什么都没有输出。


jdk1.4开始,java的string类提供了split()方法进行字符串分割,jdk1.0原来提供StringTokenizer基本上已经是“历史遗留物”了,读者可不必研究。
⑴String 提供的Split(String regex)方法需要的参数是正则表达式;
⑵ 正则表达式中的点号(.)可以匹配任意字符。


publicclass StringSplit {
   publicstaticvoid main(String[] args){
      String str ="java.ix?sdcc.dddd";
      //将这个字符串以点号(.)分隔成多个字符
      String[] strArr = str.split("\\.");      
        for(String s: strArr){
           System.out.println(s);
        }
   }
}

运行上面的程序就可以看到字符串以点号(.)分隔的结果,这就是需要的结果。由此可见,这并不是java的bug,是对java某些特性账户哦不够精确造成的误解。

下面看在看一个demo

publicclass StringReplace {
       publicstaticvoid mian(String[] args)
       {
           String clazz = "org.com.xxxx.sss.yyyy";
           //使用 replace就此简单
           String path1 = clazz.replace(".","\\");
           System.out.println(path1);
           //使用replaceAll复杂多了
           String path2 = clazz.replaceAll("\\","\\\\");
           System.out.println(path2);
       }
    }

上面程序提供了clazz字符串,然后试图将该字符串中的点号(.)替换成反斜杠(\)。如果程序使用replace方法进行替换,
因为replace()方法的参数只是普通字符串,并不是正则表达式,所以使用clazz.replace(“.”,“\”)即可。
如果使用repalceAll方法进行替换,因为replace()的参数是正则表达式,所以第一个参数需要写作“\.”,
其中\用于生成转义的反斜杠线,第二个参数为“\\”其中前两条斜线生成转义的反斜线,后两条斜线生成要替换的反斜线。

你可能感兴趣的:(正则表达式,java,Java陷阱)