题目:用代码表示把字符串org.apache.lucene转换成org/apache/lucene
看到题目,感觉很简单几行就搞定,我最开始写的代码:
String str = "org.apache.lucene";
String str1 ="";
if(str.indexOf(".")!=-1){
str1 = str.replaceAll(".","/");
}
System.out.println(str1);
结果发现打印出来的结果为:/而不是想要的 org/apache/lucene
后来突然想到 . 在正则表达式中表示匹配任何单个字符,
于是乎就会出现 / 这样的结果。杠杠的个数肯定等于str.length();
要想表示.应该是\.于是改成下面这样:
String str = "org.apache.lucene";
String str1 ="";
if(str.indexOf(".")!=-1){
str1 = str.replaceAll("\.","/");
}
System.out.println(str1);
很不幸,编译报错:
Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
于是改成这样:
String str = "org.apache.lucene";
String str1 ="";
if(str.indexOf(".")!=-1){
str1 = str.replaceAll("\\.","/");
}
System.out.println(str1);
顺利得到了想要的结果。但是搞不明白为何\.就报错呢?
搜索了一下jdk帮助文档,找到了这么一段话:
根据Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时(很明显String.replaceAll("","")第一个参数就会被解释为正则表达式),字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。
答案应该就在这里。