java基础之replace,replaceAll

2023-11-11

走在乡间的小路上---------回首过往。
以下代码结果都是显示在Console框中,所以\n会被解析成换行,\\n只显示\n。
所以看到结果换行其实是输出了\n,看到输出\n,其实输出的是\\n.

replace和replaceAll是编程中经常用到的替换函数,成功返回一个新的替换后的字符串,失败则返回原始字符串,它们都是替换字符串所有的符合规则的子串,但replaceAll接受正则表达式,所以对于普通的字符(不含正则)替换结果是一样的,但对于特殊的字符替换的经过则大相径庭。

1替换中特殊符号处理

开发中经常遇到语言中的特殊符号,有时要存入数据库,有时需要解析json中的特殊符号,有时需要显示特殊符号,android中的很多控件支持文本中\n换行,此时就会涉及到\n中的处理,当然还有很多特殊符号,这里以\n为例。
首先要想把\n存储数据库需要进行转义,其实是对\进行转义,此时从数据库中取出数据就是\\n,android中此时直接使用会显示\n而不是换行,需要替换\\n为\n时才能正确显示。
所以就会用到replace和replaceAll函数,下面就探讨下java中的这两个函数的用法。

2 java中replace和replaceAll函数

2.1例子

String str1 = "(1)升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验";
String str2 = "(1)升级服务\\n(2)重磅福利\\n(3)全新界面\\n(4)升级体验";
System.out.println(str1);
System.out.println(str2);

输出:
(1)升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
(1)升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验
java中\是特殊字符,需要转义才能使用,所以只有\n才能换行,所以java中\n代表换行,\\n代表\n

2.2replace 函数是替换一个还是替换全部

String teststr = "abcabcabcabcabc";
		String teststr2 = teststr.replace("a", "k");
		System.out.println(teststr);
		System.out.println(teststr2);

result:
abcabcabcabcabc
kbckbckbckbckbc
可以看到replace 也是替换全部。
替换一个有函数teststr.replaceFirst(regex, replacement);

2.3两个函数的区别

在这里插入图片描述
可以清晰地看到replaceAll用到了正则表达式,也就是replaceAll第一个参数是正则表达式。

2.4 特殊符号的处理

//存入数据库中的数据
		String str1 = "(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验";
		String str3 = str1.replace("\n", "\\n");
		System.out.println(str1);
		System.out.println(str3);

result(console中的结果,\n换行直接换行了,\\n会显示成\n,都是由于转义,所以看到结果换行其实是输出了\n,看到输出\n,其实输出的是\\n):
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验
正常替换,\n替换成了\\n.

//存入数据库中的数据
		String str1 = "(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验";
		
		String str3 = str1.replaceAll("\n", "\\n");
		System.out.println(str1);
		System.out.println(str3);

Result:
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
(1)1111升级服务n(2)重磅福利n(3)全新界面n(4)升级体验
直接使用replace函数上面的展示是正常的,会进行换行,但是使用replaceAll函数结果只剩下了n了。

上面说了replaceAll第一个参数是正则表达式,所以根据正则表达式的意义,想要替换\n写法就得根据正则表达式写法来。
\在java中代表转义,想要表示一个\字符需要\\转义之后就是,正则表达式中想要表示一个\也需要转义\\\\才能得到,所以结合java和正则表达式想要表示一个\的正则表达式需要\\\\,首先会被转义成\java的字符串,之后\\根据正则规则代表一个\,所以此时\\\\n就代表\n正则.

//存入数据库中的数据
	//存入数据库中的数据
		String str1 = "(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验";
		
		String str3 = str1.replaceAll("\\n", "\n");
		String str4 = str1.replaceAll("\\n", "\\n");
		String str5 = str1.replaceAll("\\n", "\\\n");
		String str6 = str1.replaceAll("\\n", "\\\\n");
		System.out.println(str1);
		System.out.println("==========3==========");
		System.out.println(str3);
		System.out.println("=========4===========");
		System.out.println(str4);
		System.out.println("===========5=========");
		System.out.println(str5);
		System.out.println("===========6=========");
		System.out.println(str6);	

result:
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
3
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
=4===
(1)1111升级服务n(2)重磅福利n(3)全新界面n(4)升级体验
===5=
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
===6=
(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验

//存入数据库中的数据
		String str1 = "(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验";
		
		String str3 = str1.replaceAll("\\\\n", "\n");
		String str4 = str1.replaceAll("\\\\n", "\\n");
		String str5 = str1.replaceAll("\\\\n", "\\\n");
		String str6 = str1.replaceAll("\\\\n", "\\\\n");
		System.out.println(str1);
		System.out.println("==========3==========");
		System.out.println(str3);
		System.out.println("=========4===========");
		System.out.println(str4);
		System.out.println("===========5=========");
		System.out.println(str5);
		System.out.println("===========6=========");
		System.out.println(str6);

result:
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
3
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
=4===
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
===5=
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
===6=
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
根据正则表达式,第一个参数代表的参数为\\\\n的正则,所以不会找到可替换值。

//存入数据库中的数据
		String str1 = "(1)1111升级服务\\n(2)重磅福利\\n(3)全新界面\\n(4)升级体验";
		
		String str3 = str1.replaceAll("\\\\n", "\n");
		String str4 = str1.replaceAll("\\\\n", "\\n");
		String str5 = str1.replaceAll("\\\\n", "\\\n");
		String str6 = str1.replaceAll("\\\\n", "\\\\n");
		System.out.println(str1);
		System.out.println("==========3==========");
		System.out.println(str3);
		System.out.println("=========4===========");
		System.out.println(str4);
		System.out.println("===========5=========");
		System.out.println(str5);
		System.out.println("===========6=========");
		System.out.println(str6);

result:
(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验
3
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
=4===
(1)1111升级服务n(2)重磅福利n(3)全新界面n(4)升级体验
===5=
(1)1111升级服务
(2)重磅福利
(3)全新界面
(4)升级体验
===6=
(1)1111升级服务\n(2)重磅福利\n(3)全新界面\n(4)升级体验

总结所以想要替换文本中的\n,需要第一个参数\n,如果要替换文本中的\\n,第一个参数需要为\\\\n.

replaceAll第二个参数

可以看到上面的代码第二个参数写法不同,替换后的显示也不相同。
replaceAll函数上部有一段注释:
Note that backslashes ({@code }) and dollar signs ({@code $}) in the
* replacement string may cause the results to be different than if it were
* being treated as a literal replacement string; see
* {@link java.util.regex.Matcher#replaceAll Matcher.replaceAll}.
* Use {@link java.util.regex.Matcher#quoteReplacement} to suppress the special
* meaning of these characters, if desired.
受正则表达式的影响,第二个参数也会受到影响,特别是\和"$"符号,$符号涉及正则匹配的分组引用,\符号也会进行转义,所以要匹配\b,就要写成\\\\b,
内存中显示的结果就是\b,利用replaceAll函数替换之后就是\b(包括被转义),如果按照正则的规则想要替换所有的数字就可以写成\\d此时就会替换所有的数字。

System.out.println("xyxyxyxyxy".replaceAll("x", "\\x")); 
		System.out.println("xyxyxyxyxy".replaceAll("x", "\\\\x")); 
		System.out.println("xy\nxy\nxy\n".replaceAll("\\n", "\\\\n")); 
		System.out.println("xy\nxy\nxy\n".replaceAll("\\n", "\\b")); 
		System.out.println("xy\nxy\nxy\n".replaceAll("\\n", "\\n")); 
		System.out.println("xy\nxy\nxy\n".replaceAll("\\n", "\\\n")); 
		System.out.println("xy\nxy\nxy\n".replaceAll("\\n", "\\\\n")); 
		System.out.println("==============================");
		System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n", "\\\\b")); 
		System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n", "\n")); 
		System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n", "\\n")); 
		System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n", "\\\n")); 
		System.out.println("xy\\nxy\\nxy\\n".replaceAll("\\\\n", "\\\\n")); 

大家可以猜一猜上面代码的结果
result:
xyxyxyxyxy
\xy\xy\xy\xy\xy
xy\nxy\nxy\n
xybxybxyb
xynxynxyn
xy
xy
xy

xy\nxy\nxy\n
==============================
xy\bxy\bxy\b
xy
xy
xy

xynxynxyn
xy
xy
xy

xy\nxy\nxy\n

由于使用了markdown格式,上面的结果可能有问题请大家看下面的图:
在这里插入图片描述

所以第二个参数也是受正则的影响的。
上面例子比较多可能有的兄弟不太想看,其实很简单使用replace和replaceAll都是替换全部,replace函数第一个参数是字符串,所以写什么就是什么,但也要注意java语言中的特殊字符转义,replaceAll函数第一个参数是正则表达式需要同时考虑java中的特殊符号的转义和正则中特殊符号的特殊意义,replaceAll函数的第二个参数需要特别注意\和$因为在正则结果替换中有特殊意义。

第二个参数源码中的处理:最终会调用Matcher中的replaceAll函数;

 public Matcher appendReplacement(StringBuffer sb, String replacement) {

        // If no match, return error
        if (first < 0)
            throw new IllegalStateException("No match available");

        // Process substitution string to replace group references with groups
        int cursor = 0;
        StringBuilder result = new StringBuilder();

        while (cursor < replacement.length()) {
            char nextChar = replacement.charAt(cursor);
            if (nextChar == '\\') {
                cursor++;
                if (cursor == replacement.length())
                    throw new IllegalArgumentException(
                        "character to be escaped is missing");
                nextChar = replacement.charAt(cursor);
                result.append(nextChar);
                cursor++;
            } else if (nextChar == '$') {
                // Skip past $
                cursor++;
                // Throw IAE if this "$" is the last character in replacement
                if (cursor == replacement.length())
                   throw new IllegalArgumentException(
                        "Illegal group reference: group index is missing");
                nextChar = replacement.charAt(cursor);
                int refNum = -1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java基础之replace,replaceAll 的相关文章

随机推荐

  • Flutter 自定义单选按钮和自定义复选框

    Flutter 自定义单选按钮和自定义复选框 前言 一 自定义单选按钮 二 自定义复选框 总结 前言 在日常开发中 很多时候系统自带的单选按钮 复选框无法满足我们的需求 那么就需要自定义样式的按钮 本篇文章将记录如何自定义单选按钮 复选框
  • Vue实现Markdown

    前言 本文将介绍如何使用Vue和SpringBoot实现一个Markdown编辑器 其中Vue用于前端 SpringBoot用于后端 实现数据存储和接口调用 项目背景 Markdown是一种轻量级的标记语言 用于简化文本编辑 最初由John
  • 初等数学概论

    author hjjdebug date 2016年 01月 18日 星期一 21 36 50 CST article 初等数学概论 记得高中的哲学书上说的 真理是相对的 没有永恒 绝对的真理 而我们这里讨论的数学 却是永恒绝对的真理 放之
  • Unity中的Debug类调试使用

    UnityEngine Debug Class containing methods to ease debugging while developing a game 该类中包含了一些便于游戏开发时的调试方法 Class Variable
  • The content of element type “configuration“ must match “(properties?,settings?,typeAliases?,typeHand

    注意 每个标签必须按顺序写
  • 有源滤波器治理谐波好在哪

    减小谐波影响应对谐波源本身或在附近采取适当的措施 通常情况下 采用加装滤波器的方式治理谐波 滤波器一般分为无源滤波器和有源滤波器 下面领步 北京 根据多年的实践经验给出一个具体的解决方案 在有谐波问题是 什么样的选择才是最好的 谐波的危害
  • React---使用componentDidUpdate钩子函数判断路由地址是否发生变化

    在组件更新 例如组件的路由更新 后会执行componentDidUpdate钩子函数 componentDidUpdate方法会传入两个参数 prevProps prevState prevProps prevState可以拿到组件更新前的
  • Web3 入门手册:从认知到实践

    如果你也喜欢 Web3 希望在这做些有趣的 有意义的事情 那么我希望这篇文章可以帮助到你 送给想要进入 Web3 或者刚刚进入 Web3 的小伙伴 但是考虑到两点原因 我还是打算把这件事推迟一些时日 一是在各大媒体都鼓吹 All In We
  • 如何将pdf转换成txt?悄悄告诉你3个好用的转换方法

    pdf和txt文档都是我们经常会使用到的文档格式 这两种文档各有各的特点 pdf文档适合用于展示 而txt文档适合用于整理各种文字信息 在面对不同的情况时我们就要使用不同的文档 就比如将纯文字的资料进行搜集的时候 利用txt文档会更方便 而
  • 如何在vue中引入字体

    一 为什么要引入字体 在前端开发中 选用合适的字体往往会极大地提升网站的视觉体验 然而 网页中默认字体的种类和风格有限 且在不同的设备 浏览器上渲染效果不尽相同 因此 很多开发者会选择自定义字体来提升用户体验 二 如何引入字体 1 搜索下载
  • 2020华为杯数学建模总结

    2020研究生数学建模竞赛总结 题目 2020年中国研究生数学建模竞赛B题 降低汽油精制过程中的辛烷值损失模型 一 背景 汽油是小型车辆的主要燃料 汽油燃烧产生的尾气排放对大气环境有重要影响 为此 世界各国都制定了日益严格的汽油质量标准 见
  • linux 套接字文件类型,Linux下的文件类型

    Linux下的文件类型 1 开头 表示普通文件 2 d开头 表示目录文件 3 b开头 表示块设备 4 c开头 表示是字符设备 5 I开头 表示符号链接文件 6 p开头 表示管道文件pipe 7 s开头 表示套接字文件socket root
  • 浅谈BERT/Transformer模型的压缩与优化加速

    作者 姚益武 单位 阿里巴巴集团 研究方向 AI算法与工程架构 前言 BERT Transformer 结构及其变体 已成为自然语言处理 NLP 语音识别 ASR 等领域的主流序列建模结构 并且 相比于卷积操作的局部特征提取能力 以及平移不
  • 【Python】ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any

    一 问题描述 在使用Python的判断语句的时候 data2 data2 Month 11 and data2 Day 11 我的本意是想找出11月11日的数据 运用上面的代码 却得到了报错 报错信息 ValueError The trut
  • [QT编程系列-38]:数据存储 - SQLite数据库存储与操作

    目录 1 SQLite数据库概述 1 1 简介 1 2 SQLite不支持网络连接 1 3 SQLite不需要安装MySQL Server数据库 1 4 SQLite性能 1 5 SQLite支持的数据条目 2 SQLite操作示例 3 Q
  • 找不到插件 ‘org.springframework.boot:spring-boot-maven-plugin:‘问题

    出现pom文件找不到插件 org springframework boot spring boot maven plugin 问题 可能是因为版本没有绑定好 去一级父类依赖找对应的插件版本 在pom文件中加上 把父类的version加到po
  • 1小时学会CSS-下

    今天给大家分享的内容包含CSS 盒子模型 CSS 标准布局 CSS 浮动布局 并以案列进行详细说明 一 CSS 盒子模型 CSS 将所有元素都当成盒子 CSS布局其实就是如何堆放盒子 组成 content 内容 gt padding 内边距
  • 【c语言】小程序游戏——飞机游戏(二)

    在接下来 我们需要对飞机添加一些属性 1 利用键盘控制飞机的移动 2 按空格键可以发射激光 NO 1 利用键盘控制飞机的移动 首先我们需要了解的是 如果想要通过按键来控制飞机的移动 那么我们具体要怎么控制呢
  • Verilog(4)系统任务monitor,time,stop,random等,编译预处理语句

    调试用系统任务和常用编译预处理语句 用于调试和差错的系统任务 以及编写模块时的预处理语句 系统任务 monitor 提供了监控和输出参数列表中表达式或变量值的功能 参数列表中输出控制格式字符串和输出表列的规则和 d i s p l a
  • java基础之replace,replaceAll

    走在乡间的小路上 回首过往 以下代码结果都是显示在Console框中 所以 n会被解析成换行 n只显示 n 所以看到结果换行其实是输出了 n 看到输出 n 其实输出的是 n replace和replaceAll是编程中经常用到的替换函数 成