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

深入理解Java中的转义字符

最近在学习《两周自制脚本语言》这本书,在词法分析的一些复杂的正则中用到了大量的转义字符’\',比如正则字符串中包含了这个部分\\\\\"你知道它是匹配什么的么?

反斜杠在字符串和正则表达式中都有特殊作用。今天让我们来深入理解一下Java中的转义字符\

先提几个问题:
  1. Java中的字符串中的\n是一个字符还是两个?
  2. Java中代码中的字符串字面量"abc",在存储的时候,字符串内容中有没有双引号?
  3. Pattern pat = Pattern.compile(“\\\\\\\\”); (双引号内有8个反斜杠),请问它可以匹配字符串中的什么内容?非得用8个反斜杠才能表达要匹配的字符串么?6个或4个可不可以?

字符串字面量

字面量两边的双引号是干嘛的

在Java代码中写出来的字符串,叫做字符串字面量,比如String name = "Jack"中的字符串Jack就是字面量形式给出来的,它在编译后的程序中会保存在字符串常量池中。保存的内容仅仅是Jack这个字符串,共4个字符,是没有两边的双引号的。两边的双引号,仅仅是代码中写的,给Java编译器看的,编译器看到代码中出现了双引号,就知道接下来的内容是字符串,所以真正的字符串内容就是Jack这四个字符。想想name.length()不就是4么。

字符串内容中有双引号怎么办

假设我有个字符串内容是"You hurt me", she said.。代码中如果将这个字符串不做处理地用双引号包裹起来就出了问题:

String str = ""You hurt me", she said.";

编译器的眼里,只有两个字符串,第一个是空字符串,第二个是, she said.。因为编译器是通过双引号来判断字符串字面量的起止位置的。

如果你想要在字符串中包含双引号,代码要这么写:

String str = "\"You hurt me\", she said.";

即在字符串内容中的双引号前加上反斜杠作为转义字符,这样编译器读取到\"的时候,就不会认为它是字符串的结束了。

字符串内容中有反斜杠怎么办

假设我们字符串的内容中也有反斜杠,比如The backslash \ is an escape character,我们也需要在反斜杠前加一个反斜杠作为转义字符:

String str = "The backslash \\ is an escape character";
多个连续的反斜杠该怎么解读

那如果字符串的内容包含了\"该怎么写的?比如字符串的内容是The \" inner string literals means a double quote,那就要写成如下的方式:

String str = "The \\\" inner string literals means a double quote";

在字符串字面量中,如果有多个反斜杠连在一起,则奇数位置(1,3,5,7…)上的反斜杠表示转义,和它后边的字符共同决定含义。那么字符串字面量中的\\\"中的第1个反斜杠表示对它后边的反斜杠的转义,第2个反斜杠就不再是转义字符了,它被它前面的转义字符给剥夺了转义的超能力。前两个反斜杠连在一起表示一个反斜杠字符,第3个反斜杠和它后面的双引号一起表示字符串内容中的双引号。

在这里插入图片描述

字符串中多个反斜杠连续起来,只有奇数位置1,3,5,7这些位置上的反斜杠具有转义的超能力,其它位置上的都被它前面的转义字符给剥夺了转义的超能力,仅仅表示反斜杠字符本身了。所以字符串中的\\\\\\\\(8个反斜杠)表示的其实是4个反斜杠字符。这4个反斜杠字符不再具有转义的能力,不会继续转义下去。

在这里插入图片描述
但是,如果这个8个反斜杠的字符串作为正则表达式的话,它的内容是4个反斜杠,这其中奇数位置的反斜杠又有了转义的能力,不过这个转义能力是正则表达式中的转义。 所以8个反斜杠的字符串作为Pattern.compile参数的话,它先是被解读为字符串,然后这个字符串又被当作正则表达式的pattern使用。4个反斜杠在正则表达式中表示的是两个连续的反斜杠。本文后边会讲解正则表达式中的转义。

字符串内容中包含换行怎么办

如果字符串中包含了换行符,那么就需要在字符串中用\n来表示换行,换行符实际上是一个字符,因为换行符是不可打印不可显示的字符,所以你没办法在代码中直接表示它,各种编程语言都规定用\n来表示换行,也就是说在程序的代码中,要用反斜杠和字母n的组合来表示换行,但是实际上它们的组合表示的是一个换行符。

/*** 一个字符,才可以用char类型*/
char c = '\n';
String lineSeparator = "\n";
System.out.println(lineSeparator.length()); // 输出1

正则表达式中的反斜杠

在正则表达式中也有反斜杠\,它也有转义的能力。比如正则表达式中的元字符表示或的关系,如果在它前面加上了反斜杠,就仅仅表示竖线了:

在这里插入图片描述

在这里插入图片描述

也就是说在正则表达式中,反斜杠字符也是有转义的超能力的。

当Java的字符串遇上正则表达式

注意:反斜杠在Java的字符串和正则表达式中都具有转义的作用,如果它们遇到一起就需要分两步骤来解读反斜杠: 第一步将它作为字符串的含义解读出来,第二步将前一步解读出来的字符串作为正则表达式的含义解读出来。

比如我想匹配字符串中的a|b,用正则表达式写的pattern就是a\|b,可是到了java中,就得写成下面的:

// 要多加一个转义,看起来貌似正则表达式本身不太一样似的
Pattern pat = Pattern.compile("a\\|b"); 

而如果正则表达式中要匹配的是反斜杠本身,就更麻烦了,在正则表达式中要用两个反斜杠才能表达反斜杠本身。而要用java的字符串来写正则表达式的pattern,反斜杠的数量还要翻倍,比如:

Pattern pat = Pattern.compile("\\\\"); // 用于匹配字符串中单个反斜杠 

现将代码中的四个反斜杠的字符串字面量解读成有两个反斜杠字符的字符串内容本身,然后将有两个反斜杠的字符串内容作为正则表达式的pattern,那么本来已经归于平凡的反斜杠在正则表达式中又一次具有了转义的能力!

在这里插入图片描述

所以说如果Java中的正则表达式要想匹配字符串中的\",要写成:

//前面4个反斜杠表示一个不具备转义能力的反斜杠字符,
//第5个反斜杠和后边的双引号表示字符串内容中的双引号
Pattern pat = Pattern.compile("\\\\\""); 

为什么Java中的正则会有转义字符满天飞,不好读懂

造成这个现象的原因,就是Java中不支持raw string这种字符串,比如有的编程语言通过三个双引号或者三个单引号来表示raw string,这样在raw string中有双引号之类的就不用再转义一下了。比如Rust中的raw string:

在这里插入图片描述

如果用Rust的正则来匹配字符串中的反斜杠本身,则简单的多:

    //用于匹配字符串中的反斜杠,注意这儿之所以还需要写两个反斜杠,是正则表达式本身就需要两个//因为在正则表达式中,反斜杠也具有转义的功能,如果用Java写,则要写4个,多一倍的反斜杠是Java字符串造成的let regex = Regex::new(r"\\").unwrap();

英文词汇:

  1. 转义字符: escape character
  2. 反斜杠(\): backslash
  3. 字符串字面量: string literals

相关文章:

深入理解Java中的转义字符

最近在学习《两周自制脚本语言》这本书,在词法分析的一些复杂的正则中用到了大量的转义字符’\,比如正则字符串中包含了这个部分\\\\\"你知道它是匹配什么的么? 反斜杠在字符串和正则表达式中都有特殊作用。今天让我们来深入理解一下Ja…...

VScode 调试 linux内核

VScode 调试 linux内核 这里调试的 linux 内核是通过 LinuxSD卡(rootfs)运行的内核 gdb 命令行调试 编辑 /home/tyustli/.gdbinit 文件,参考 【GDB】 .gdbinit 文件 set auto-load safe-path /home/tyustli/code/open_source/kernel/linux-6.5.7/.gdbinit在 lin…...

Babylonjs学习笔记(五)——创建PBR材质

书接上回,这里讨论PBR材质!!! // 创建天空盒/* */const createSkyBox (scene:Scene):void>{const envTex CubeTexture.CreateFromPrefilteredData(./env/environment.env,scene)scene.environmentTexture envTex;scene.cre…...

C++ -- 深入理解多态

前言:多态的概念,通俗地来讲就是多种形态。当我们要完成某个行为的时候,不同的对象去完成时会产生不同的状态,这就叫做多态。具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。多态在C的类和对象中…...

【Java】泛型通配符

类型通配符 类型通配符<?> 一般用于接受使用&#xff0c;不能够做添加List<?>&#xff1a;表示元素类型未知的list&#xff0c;它的元素可以匹配任何类型带通配符的List仅表示它是各种泛型List的父类&#xff0c;并不能把元素添加到其中类型通配符上限&#xff1…...

NNDL:作业五

习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明&#xff1a; 激活函数以sigmoid为例。 神经元&#xff1a;有两层&#xff0c;线性层和激活层&#xff1a;yw*xb,然后y‘sigmoid(y)&#xff0c;也就是。 梯度…...

OpenAI大模型项目计划表(InsCode AI 创作助手)

OpenAI大模型项目计划表 阶段任务负责人开始日期完成日期立项确定项目目标和范围项目经理2023-05-012023-05-03确定项目团队和资源项目经理2023-05-042023-05-05确定项目时间表和里程碑项目经理2023-05-062023-05-10数据收集收集训练数据和标注数据团队2023-05-112023-05-20确…...

MyBatis入门的第一个程序

2023.10.28 今天正式开始MyBatis的学习&#xff0c;先来一个入门程序的编写。 ①准备一个数据库表&#xff1a; ②配置pom.xml文件&#xff1a;&#xff08;打包方式和2个依赖的引入&#xff09; <?xml version"1.0" encoding"UTF-8"?> <proj…...

React项目中使用zustand状态管理详细教程

zustand 是一个用于状态管理的小巧而强大的库&#xff0c;它与 React 非常兼容。以下是使用 zustand 在 React 项目中进行状态管理的详细教程&#xff1a; 步骤 1&#xff1a;安装 zustand 首先&#xff0c;你需要安装 zustand。你可以使用 npm 或 yarn 安装它&#xff1a; …...

Linux 扩展 root 文件系统

本文描述的是通过Linux自带的工具&#xff0c;不用安装额外的包&#xff0c;来实现root文件系统的扩展。 我们可以看到&#xff0c;根盘46.6G&#xff1a; # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 46.6G 0 disk ├─sda1 …...

19c-rac环境安装AHF

准备给19c rac打补丁&#xff0c;发现tfa报错&#xff0c;如下 [rootdb1 /]# /u01/app/19.0.0/grid_1/OPatch/opatchauto apply /opt/update/35370167/35319490 -oh /u01/app/19.0.0/grid_1 OPatchauto session is initiated at Sat Oct 28 19:33:56 2023 System initializ…...

ESP32网络开发实例-Web控制按钮与硬件状态同步

Web控制按钮与硬件状态同步 文章目录 Web控制按钮与硬件状态同步1、应用介绍2、软件准备3、硬件准备4、代码实现在文中,我们将介绍同时使用网络服务器和物理按钮来控制 ESP32输出。 换句话说,如果用户使用按钮控制 LED,则 LED 的状态也会在 Web 服务器上自动更新。 1、应用介…...

分享一下怎么做陪诊小程序

在当今快节奏的社会中&#xff0c;人们的生活压力越来越大&#xff0c;尤其是在大城市中&#xff0c;由于工作繁忙&#xff0c;生活节奏快&#xff0c;很多人都感到看病难、看病贵的问题。为了解决这一问题&#xff0c;陪诊小程序应运而生。陪诊小程序是一种可以提供线上预约、…...

【Linux】Linux+Nginx部署项目

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.单体项目的部署 0.我们需要将要进行部…...

【git命令】删除分支

1. 删除本地分支 使用git branch -d命令删除本地分支 git branch -d branch_name其中&#xff0c;branch_name是分支名。如果有未合并的更改&#xff0c;Git会阻止你删除分支。 使用git branch -D命令强制删除本地分支 git branch -D branch_name这个命令会强制删除分支&am…...

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器 泰克示波器是经常用到的工具&#xff0c;一般手动操作即可&#xff0c;但有时候也要集成到系统中&#xff0c;需要程控。这时候先要下载厂家提供的例子&#xff0c;了解LabVIEW的demo。根据不用的示波器型号&#xff0c;选择和计…...

1. 两数之和、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…...

TSINGSEE青犀基于AI视频识别技术的平安校园安防视频监控方案

一、背景需求 因学校频频出治安事件&#xff0c;所以必须要加强学校的安防工作&#xff0c;目前来看&#xff0c;大部分校园都建设了视频监控来预防保障校园安全。但是传统的视频监控系统&#xff0c;主要通过设备来录像以及人员时时监控来进行。这种监管方式效率十分低下&…...

基于LSTM encoder-decoder模型实现英文转中文的翻译机器

前言 神经网络机器翻译(NMT, neuro machine tranlation)是AIGC发展道路上的一个重要应用。正是对这个应用的研究&#xff0c;发展出了注意力机制&#xff0c;在此基础上产生了AIGC领域的霸主transformer。我们今天先把注意力机制这些东西放一边&#xff0c;介绍一个对机器翻译…...

世界前沿技术发展报告2023《世界航空技术发展报告》(四)无人机技术

&#xff08;四&#xff09;无人机技术 1.无人作战飞机1.1 美国空军披露可与下一代战斗机编组作战的协同式无人作战飞机项目1.2 俄罗斯无人作战飞机取得重要进展 2.支援保障无人机2.1 欧洲无人机项目通过首个里程碑2.2 美国海军继续开展MQ-25无人加油机测试工作 3.微小型无人机…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...