百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

String 方法中 replace 和 replaceAll 详解

yund56 2025-03-18 23:46 20 浏览

前言

我们先做一个简单的概述:

  1. replace() 和 replaceAll() 都是常用的替换字符串的方法;
  2. 两者都是全部替换,可以把源字符串中的某一字符或字符串全部换成指定的字符或字符串;
  3. 如果只想替换第一次出现的,可以使用 replaceFirst();
  4. 这个方法也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串;
  5. replaceAll() 和 replaceFirst() 所用的替换参数可以是普通字符串,也可以是正则表达式;
  6. 如果 replaceAll() 和 replaceFirst() 所用的参数据不是基于规则表达式的,那么它们与 replace() 替换字符串的效果、效率是一样的。

注意:执行了替换操作后,返回一个新的对象,源字符串的内容是没有发生改变的。

源码分析

来看看源码中关于两个方法的定义,我分别摘取了一段:

* String.class */
...
/** 
 * Replaces each substring of this string that matches the literal target sequence 
 * with the specified literal replacement sequence ...
 * 翻译:用指定的文字替换序列替换与文字目标序列匹配的字符串的每个子字符串。
 */
public String replace(CharSequence target, CharSequence replacement) {
	return Pattern.compile(target.toString(),Pattern.LITERAL).
		matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
    }
...

/** 
 * Replaces each substring of this string that matches the given regular expression 
 * with the given replacement...
 * 翻译:将与给定正则表达式匹配的字符串的每个子字符串替换为给定的替换。
 */
public String replaceAll(String regex, String replacement) {
	return Pattern.compile(regex).
		matcher(this).replaceAll(replacement);
}
...

通过方法的定义,我们发现:replaceAll() 在定义它的时候,就被赋予可以匹配正则表达式的功能。 通过源码,可以总结两点:

  1. String.replace() 和 String.replaceAll() 调用的方法是一样的,都是Matcher.replaceAll() 方法;
  2. replaceAll() 方法没有传入参数 “Pattern.LITERAL”;

就是这一点点的不同,决定了 replaceAll() 方法需要优先判断被替换的参数 regex 是不是一个正则表达式。

  • 如果是正则,执行正则替换;
  • 如果是字符串,执行字符串替换,此时和 replace() 就是一样的了。

replaceAll() 源码分析

我知道学技术的小伙伴都属于“刨根问底”栏目组的,下面我带大家看一看,参数 "Pattern.LITERAL"是怎么影响业务逻辑的:

1. String.replaceAll(String regex, String replacement) 函数如下:

它共调用了三个函数,作用分别是:

  • Pattern.compile(String regex) – 编译(解析)正则表达式,获得Pattern对象;
  • Pattern.matcher(CharSequence input) – 获取匹配器;
  • Matcher.replaceAll(String replacement) – 替换字符串;

顾名思义,我们需要解释的重点,就在 Pattern.compile(String regex) 方法中。

2. Pattern.compile(String regex) 函数如下:

它返回的是一个Pattern对象。

3. Pattern的构造函数如下:

这个构造函数是 private 级别的,不能被其他类直接调用,只能通过 Pattern 类的 compile(String regex) 和 compile(String regex, int flags) 调用。 该构造函数调用了 compile(),对 regex 参数的处理就发生在这个函数里面!!

4. Pattern.compile()函数如下:

其中:

  • ①中的参数"LITERAL"就是我们上面提到的那一点点不用(不清楚的可以再回看一下);
  • ①处的 if – else 语句,决定②处是否执行;
  • ②处的 matchRoot = expr(lastAccept);就是获得正则表达式匹配根结点的方法,若执行此方法,则开始进行正则表达式的匹配。

好了,再往下的代码我就不再演示了,有兴趣的小伙伴可以自己看一看。

代码论证

说了很多理论的东西,写几行代码验证下:

@Test
public void replaceTest() {
    String str1 = "Aoc.Iop.Aoc.Iop.Aoc";	    //定义三个一样的字符串
    String str2 = "Aoc.Iop.Aoc.Iop.Aoc";
    String str3 = "Aoc.Iop.Aoc.Iop.Aoc";

    String str11 = str1.replace(".", "#");	    // str11 = "Aoc#Iop#Aoc#Iop#Aoc"
    String str22 = str2.replaceAll(".", "#");	    // str22 = "###################"
    String str33 = str3.replaceFirst(".", "#");	    // str33 = "#oc.Iop.Aoc.Iop.Aoc"
}

由于“.”属于正则表达式的符号,所以 replaceAll() 方法执行的是正则替换。

转义符号 – “\”,需要格外注意下:

  • “\” 在 java 中是一个转义字符,所以需要用两个代表一个。 例如 System.out.println(“\\”);只打印出一个 “\”;
  • “\”也是正则表达式中的转义字符(replaceAll()的参数就是正则表达式),也需要用两个代表一个。 所以:“\\\\”会被j ava 转换成 “\\”,“\\” 又会被正则表达式转换成“\”。

看一个例子:

@Test
public void replaceTest() {
    String str1 = "blog.csdn.net/weixin_44259720/";
    String str2 = "blog.csdn.net/weixin_44259720/";
	    	
    String str11 = str1.replace("/", "\\");		// 转义
    String str22 = str2.replaceAll("/", "\\\\");	// 转义 + 正则匹配
}
	
输出结果相同:
    str11 = "blog.csdn.net\weixin_44259720\"
    str22 = "blog.csdn.net\weixin_44259720\"

小结

  1. replace 的参数是 char 和 CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence 即字符串序列的意思,说白了也就是字符串);
  2. replaceAll 的参数是 regex,即基于正则表达式的替换。比如,可以通过 replaceAll ("\d", “*”) 把一个字符串所有的数字字符都换成星号;
  3. String 类执行了替换操作后,返回一个新的对象,源字符串的内容是没有发生改变的。

作者:IT无知君
链接:
https://juejin.cn/post/7020951662546124837

相关推荐

SM小分队Girls on Top,女神战队少了f(x)?

这次由SM娱乐公司在冬季即将开演的smtown里,将公司的所有女团成员集结成了一个小分队project。第一位这是全面ACE的大姐成员权宝儿(BoA),出道二十年,在日本单人销量过千万,韩国国内200...

韩国女团 aespa 首场 VR 演唱会或暗示 Quest 3 将于 10 月推出

AmazeVR宣布将在十月份举办一场现场VR音乐会,观众将佩戴MetaQuest3进行体验。韩国女团aespa于2020年11月出道,此后在日本推出了三张金唱片,在韩国推出了...

韩网热议!女团aespa成员Giselle在长腿爱豆中真的是legend

身高163的Giselle,长腿傲人,身材比例绝了...

假唱而被骂爆的女团:IVE、NewJeans、aespa上榜

在韩国,其实K-pop偶像并不被认为是真正的歌手,因为偶像们必须兼备舞蹈能力、也经常透过对嘴来完成舞台。由于科技的日渐发达,也有许多网友会利用消音软体来验证K-pop偶像到底有没有开麦唱歌,导致假唱这...

新女团Aespa登时尚大片 四个少女四种style

来源:环球网

韩国女团aespa新歌MV曝光 画面梦幻造型超美

12月20日,韩国女团aespa翻唱曲《DreamsComeTrue》MV公开,视频中,她们的造型超美!WINTER背后长出一双梦幻般的翅膀。柳智敏笑容甜美。宁艺卓皮肤白皙。GISELLE五官精致...

女网友向拳头维权,自称是萨勒芬妮的原型?某韩国女团抄袭KDA

女英雄萨勒芬妮(Seraphine)是拳头在2020年推出的第五位新英雄,在还没有正式上线时就备受lsp玩家的关注,因为她实在是太可爱了。和其他新英雄不同的是,萨勒芬妮在没上线时就被拳头当成虚拟偶像来...

人气TOP女团是?INS粉丝数见分晓;TWICE成员为何在演唱会落泪?

现在的人气TOP女团是?INS粉丝数见分晓!现在爱豆和粉丝之间的交流方法变得多种多样,但是Instagram依然是主要的交流手段。很多粉丝根据粉丝数评价偶像的人气,拥有数百、数千万粉丝的组合作为全球偶...

韩国女团MVaespa Drama MV_韩国女团穿超短裙子跳舞

WelcometoDrama.Pleasefollow4ruleswhilewatchingtheDrama.·1)Lookbackimmediatelywhenyoufe...

aespa师妹团今年将出道! SM职员亲口曝「新女团风格、人数」

记者刘宛欣/综合报导南韩造星工厂SM娱乐曾打造出东方神起、SUPERJUNIOR、少女时代、SHINee、EXO等传奇团体,近年推出的aespa、RIIZE更是双双成为新生代一线团体,深受大众与粉丝...

南韩最活跃的女团aespa,新专辑《Girls》即将发布,盘点昔日经典

女团aespa歌曲盘点,新专辑《Girls》即将发布,期待大火。明天也就是2022年的7月8号,aespa新专辑《Girls》即将发行。这是继首张专辑《Savage》之后,时隔19个月的第二张专辑,这...

章泽天女团aespa出席戛纳晚宴 宋康昊携新片亮相

搜狐娱乐讯(山今/文玄反影/图科明/视频)法国时间5月23日晚,女团aespa、宋康昊、章泽天等明星亮相戛纳晚宴。章泽天身姿优越。章泽天肩颈线优越。章泽天双臂纤细。章泽天仪态端正。女团aespa亮...

Aespa舞台暴露身高比例,宁艺卓脸大,柳智敏有“TOP”相

作为SM公司最新女团aespa,初舞台《BlackMamba》公开,在初舞台里,看得出来SM公司是下了大功夫的,虽然之前SM公司新出的女团都有很长的先导片,但是aespa显然是有“特殊待遇”。运用了...

AESPA女团成员柳智敏karina大美女

真队内速度最快最火达成队内首个且唯一两百万点赞五代男女团中输断层第一(图转自微博)...

对来学校演出的女团成员语言性骚扰?韩国这所男高的学生恶心透了

哕了……本月4日,景福男子高中相关人士称已经找到了在SNS中上传对aespa成员进行性骚扰文章的学生,并开始着手调查。2日,SM娱乐创始人李秀满的母校——景福高中迎来了建校101周年庆典活动。当天,S...