java基础之replace,replaceAll

2024-05-06 13:58
文章标签 java 基础 replace replaceall

本文主要是介绍java基础之replace,replaceAll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

走在乡间的小路上---------回首过往。
以下代码结果都是显示在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 errorif (first < 0)throw new IllegalStateException("No match available");// Process substitution string to replace group references with groupsint 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 replacementif (cursor == replacement.length())throw new IllegalArgumentException("Illegal group reference: group index is missing");nextChar = replacement.charAt(cursor);int refNum = -1;

这篇关于java基础之replace,replaceAll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/964544

相关文章

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试