如下代码:
public class Example020 {
public static void main(String[] args) {
String separator = File.separator;
String clazzName = Example020.class.getName();
String rs1 = clazzName.replace(".", separator); // 方法1
String rs2 = clazzName.replaceAll("\\.", "\\\\");// 方法2
String rs3 = clazzName.replaceAll(Pattern.quote("."),
Matcher.quoteReplacement(separator));// 方法3
System.out.println("class name =" + clazzName);
System.out.println("rs1=" + rs1);
System.out.println("rs2=" + rs2);
System.out.println("rs3=" + rs3);
}
}
分析说明:
上述代码是java字符串替换的三种方法。Java从1.5版本后提供了两种字符串替换方法:replace和replaceAll。这两个方法的功能相同,都能够替换字符串所有需要替换的字符(虽然命名很具有迷惑性)。不同的是,replace方法传入的参数是要被替换的字符和替换后的字符;replaceAll传入的是要被替换的字符和替换后字符的正则表示。
方法1中,传入要被替换的"."和替换后的文件分隔符(不同系统不同);
方法2中,由于"."在正则表达式中表示任何字符,如果直接传入".",则被操作字符串的所有内容都会被替换,所以这里需要加入转义,也就是"\\."。第一个\表示转义,而\本身又是特殊字符需要被转义,所以需要再次转义,所以是两个\。替换后字符传入的是"\\\\",\本身是windows文件路径分隔符,但是传入时需要转义,保证传入的是路径分隔符而不是转义符,所以传入的字符就需要2个\,加上字符串表示(表明传入的不是转义字符)需要2个\,共需要使用4个\来表达一个文件分隔符。如果这里传入的是两个\,在windows执行将会出现错误,而且这个错误的提示并不友好,导致很多时候完全无法定位错误缘由。值得注意的是,在linux下,这里就不需要这么麻烦,可以直接传入文件分隔符/即可。
//使用replaceAll,第二个参数传入"\\"的不友好错误提示
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(String.java:658)
at java.util.regex.Matcher.appendReplacement(Matcher.java:762)
at java.util.regex.Matcher.replaceAll(Matcher.java:906)
at java.lang.String.replaceAll(String.java:2162)
at cn.itape.java.disabuse.Example020.main(Example020.java:13)
方法3中,从1.5以后,java提供了两个的方法,将字符串直接转化正则表达式形式,直接使用即可,避免了方法2中需要自己加入转义,减少错误发生的可能性。
(注:本【java解惑】系列,均是博主阅读《java解惑》原书后,将原书上的讲解和例子部分改编,然后写成博文进行发布的。所有例子均亲自测试通过,并共享在github上。通过这些例子,激励自己,惠及他人。同时,本系列所有博文会同步发布在博主个人微信公众号(搜索“爱题猿”或者“ape_it”),方便大家阅读。如果文中有任何侵犯原作者权利的内容,请及时告知博主,以便及时删除;如果读者对文中的内容有异议或者问题,欢迎通过博客留言或者微信公众号留言等方式共同探讨。)
源代码地址:https://github.com/rocwinger/java-disabuse
本文出自 “winger” 博客,谢绝转载!