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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]