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

devtools/2025/1/8 7:50:33/

代码:

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.ppmy.cn/devtools/148839.html

相关文章

python实战(十三)——基于Bert+HDBSCAN的微博热搜数据挖掘

一、任务目标 众所周知,微博热搜几乎是许多网友的主要新闻来源,上面实时更新着当前最新的社会消息,其时效性甚至比每天晚上播出的新闻联播还要强。这篇文章,我们使用来自Kaggle的《MicroBlog-Hot-Search-Labeled》数据集&#xff…

spark on hive 参数

set hive.execution.enginespark; set spark.app.nametest9999; set spark.executor.cores5; set spark.executor.memory20G; set spark.executor.instances5; set spark.driver.memory5G; set spark.memory.fraction0.9; –定义了 Spark 作业中每个 stage 的默认 task 数量。 …

python代码实现了一个金融数据处理和分析的功能,主要围绕国债期货及相关指数数据展开

# 忽略某些模块的提示信息 import warnings warnings.filterwarnings("ignore") # 在全局配置中添加RQData账号信息 import rqdatac as rq from typing import List import pandas as pd import numpy as np import re from datetime import datetime, timedelta,tim…

论文精读:Root Cause Analysis in Microservice Using Neural Granger Causal Discovery

Root Cause Analysis in Microservice Using Neural Granger Causal Discovery 摘要 微服务架构因其可扩展性、维护性和灵活性在IT运营中得到广泛应用,但系统故障时SREs难以确定根本原因。以往研究使用结构化学习方法建立因果关系图,但忽略了时间序列数据的时间顺序,无法利…

DCU异构程序——GEMM

目录 一、概述 二、程序实现 三、编译运行 一、概述 HIP属于显式编程模型,需要在程序中明确写出并行控制语句,包括数据传输、核函数启动等。核函数是运行在DCU上的函数,在CPU端运行的部分称为主机端(主要是执行管理和启动&…

机器学习期末复习知识点

Apriori算法 基本思想: 1 找到所有的频繁项集 2 由频繁项集找到所有的强关联规则 目标: 给定一个事务集T,关联规则挖掘的目标是找到所有规则满足以下要求: 1 support>minsup threshold 2 confidence>minconf thresho…

OSPF - 1类LSA(Router-LSA)

点击返回LSA对照表 1类LSA是OSPF计算最原始的材料,他会泛洪发给所有的路由器 LSA是包含在LSU中的,一条LSU能够携带多条LSA options位所有LSA都会有,用于标记起源于什么类型的区域,具体查看文章【邻居建立】 flags位是一类LSA特…

Lua协同程序(线程)

1、 Lua 的协同程序(coroutine)简单介绍 Lua 的协同程序(coroutine)是一种轻量级的线程,允许你在多个任务之间进行协作式多任务处理。与操作系统线程不同,协同程序是由程序员显式控制的,不会自动…