java 转义 反斜杠 Unexpected internal error near index 1

代码:

html 复制代码
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"));

输出结果

html 复制代码
acc
acc
acc

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

解释一

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

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

根据以上两条,得出

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

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

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

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个反斜杠表示一个反斜杠。

相关推荐
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_6 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble6 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟6 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖7 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707538 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_8 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.8 小时前
Day06——权限认证-项目集成
java
瑶山8 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy8 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法