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

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进