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 Boot 2.7.8 集成 Thymeleaf的最佳实践与常见问题讨论

《SpringBoot2.7.8集成Thymeleaf的最佳实践与常见问题讨论》本文详细介绍了如何将SpringBoot2.7.8与Thymeleaf集成,从项目依赖到配置文件设置,再到控制器... 目录前言一、如何构建SpringBoot应用1、项目依赖 (pom.XML)2、控制器类3、Thymelea

SpringBoot项目jar依赖问题报错解析

《SpringBoot项目jar依赖问题报错解析》本文主要介绍了SpringBoot项目中常见的依赖错误类型、报错内容及解决方法,依赖冲突包括类找不到、方法找不到、类型转换异常等,本文给大家介绍的非常... 目录常见依赖错误类型及报错内容1. 依赖冲突类错误(1) ClassNotFoundExceptio

springboot控制bean的创建顺序

《springboot控制bean的创建顺序》本文主要介绍了spring-boot控制bean的创建顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1、order注解(不一定有效)2、dependsOn注解(有效)3、提前将bean注册为Bea

Java中的ConcurrentBitSet使用小结

《Java中的ConcurrentBitSet使用小结》本文主要介绍了Java中的ConcurrentBitSet使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、核心澄清:Java标准库无内置ConcurrentBitSet二、推荐方案:Eclipse

java中的Supplier接口解析

《java中的Supplier接口解析》Java8引入的Supplier接口是一个无参数函数式接口,通过get()方法延迟计算结果,它适用于按需生成场景,下面就来介绍一下如何使用,感兴趣的可以了解一下... 目录1. 接口定义与核心方法2. 典型使用场景场景1:延迟初始化(Lazy Initializati

Java中ScopeValue的使用小结

《Java中ScopeValue的使用小结》Java21引入的ScopedValue是一种作用域内共享不可变数据的预览API,本文就来详细介绍一下Java中ScopeValue的使用小结,感兴趣的可以... 目录一、Java ScopedValue(作用域值)详解1. 定义与背景2. 核心特性3. 使用方法

spring中Interceptor的使用小结

《spring中Interceptor的使用小结》SpringInterceptor是SpringMVC提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑,通过实现HandlerIntercept... 目录一、Interceptor 的核心概念二、Interceptor 的创建与配置三、拦截器的执行顺

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Spring Boot 中 RestTemplate 的核心用法指南

《SpringBoot中RestTemplate的核心用法指南》本文详细介绍了RestTemplate的使用,包括基础用法、进阶配置技巧、实战案例以及最佳实践建议,通过一个腾讯地图路线规划的案... 目录一、环境准备二、基础用法全解析1. GET 请求的三种姿势2. POST 请求深度实践三、进阶配置技巧1

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi