java正则表达式陷阱

来源:互联网 发布:成都建信软件 编辑:程序博客网 时间:2024/05/16 15:09

直接看代码:

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()的参数是正则表达式,所以第一个参数需要写作“\.”,
其中\用于生成转义的反斜杠线,第二个参数为“\\”其中前两条斜线生成转义的反斜线,后两条斜线生成要替换的反斜线。

0 0