当前位置: 首页 > article >正文

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字符,用双斜线。

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


http://www.kler.cn/a/470934.html

相关文章:

  • Mysql--基础篇--数据类型(整数,浮点数,日期,枚举,二进制,空间类型等)
  • UWB实操:用信号分析仪(频谱分析仪)抓取UWB频域的图像
  • 【网络安全技术与应用】(选修)实验8 入侵检测
  • pytest日志显示
  • LInux单机安装Redis
  • C语言 扫雷程序设计
  • (leetcode算法题)371. 两整数之和
  • xilinx的高速接口构成原理和连接结构及ibert工具的使用-以k7 GTX为例
  • Ubuntu-bk搭建
  • springboot547产业园区智慧公寓管理系统(论文+源码)_kaic
  • PHP如何删除数组中的特定值?
  • 小R的蛋糕分享
  • 企业级Nosql数据库和Redis集群
  • 查找路由器的管理后台ip【通用找IP】
  • 在高德地图上加载3DTilesLayer图层模型/天地瓦片
  • excel填充十六进制
  • 2025年京东云快速搭建幻兽帕鲁联机服务器教程
  • STM32-笔记18-呼吸灯
  • docker 基本使用
  • JavaVue-Get请求 数组参数(qs格式化前端数据)
  • 汇编语言与接口技术--跑马灯
  • OpenGL材质系统和贴图纹理
  • 【2024华为OD-E卷-100分-火星文计算】(题目+思路+JavaC++Python解析)
  • 网络物理互连
  • 固定资产管理系统|Java|SSM|VUE| 前后端分离
  • qemu-kvm使用简介