java 反斜杠 Unexpected internal error near index 1详解编程语言

代码:

String str="a//c"; 
//出现异常,Unexpected internal error near index 1 
//System.out.println(str.replaceAll("//", "c")); 
		 
//以下三种都正确 
System.out.println(str.replace('//', 'c')); 
System.out.println(str.replace("//", "c")); 
System.out.println(str.replaceAll("////", "c"));

输出结果

acc 
acc 
acc

关于这个问题有两种解释办法,都讲得通。

解释一

1、 java字符串或者char中,表示反斜杠,都用//,两个反斜杠表示。因为根据java语言规范,unicode字符用/uxxxx表示,比如汉字“你”的unicode值是“/u4f60”,所以,为了避免被解释为unicode字符,用双斜线。

java 反斜杠 Unexpected internal error near index 1详解编程语言

2、java的正则表达式中,对于反斜杠用两个反斜杠表示。

java 反斜杠 Unexpected internal error near index 1详解编程语言

根据以上两条,得出

如果是字符串,那么//表示/

如果是正则表达式,那么////表示/

再来分析上述输出结果的原因,首先查看replace、replaceAll的api,如下图

java 反斜杠 Unexpected internal error near index 1详解编程语言

1、replace(char,char)方法的参数是char,是字符不是正则表达式,所以,用两根反斜杠表示/

2、replace(CharSequence,CharSequence),方法参数是CharSequnce,是字符不是正确表达式,所以用两根反斜杠表示/

3、replaceAll(regex,replacement),方法参数是正则表达式; 字符串中的/,经过规则1(字符串中两个反斜杠表示反斜杠)转换后是//,再经过规则2(正则表达式中两个反斜杠表示反斜杠),转换为////

补充:

如果在windows操作系统下,也可以使用replaceAll(File.separator+File.separator,”/”),打印File.separator会发现是一个反斜杠,但是内部存的时候是两个反斜杠,所以,如果是两个File.separator,则一共是四个反斜杠

解释二

1、反斜杠(/)属于元字符,在字符串中表示时,必须转义,所以是//

2、在正则表达式中,元字符要进行双重转义,比如/,转义一次是//,第二次转义就是////

这种解释,跟js中的正则表达式是一样的,可以参考《javascript高级程序设计》RegExp类型这一节

总结:

无论怎样谨记以下规则:

字符串中用2个反斜杠表示一个反斜杠。

正则表达式中都需要用4个反斜杠表示一个反斜杠。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20258.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论