另一个有意思的题目

题目:用代码表示把字符串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//)"。

答案应该就在这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值