Java中replace、replaceAll和replaceFirst函数的用法小结_java

首先概述一下他们三个的用法:

· replace(CharSequence target, CharSequence replacement) ,用replacement替换所有的target,两个参数都是字符串。

· replaceAll(String regex, String replacement) ,用replacement替换所有的regex匹配项,regex很明显是个正则表达式,replacement是字符串。

· replaceFirst(String regex, String replacement) ,基本和replaceAll相同,区别是只替换第一个匹配项。

接下来有个简单的需求,就是把源字符串中的a替换成\a,代码如下:

System.out.println("abac".replace("a", "\\a")); //\ab\ac
System.out.println("abac".replaceAll("a", "\\a")); //abac
System.out.println("abac".replaceFirst("a", "\\a")); //abac

结果让人大吃一惊,用了这么多年的替换,竟然有点蒙了。

源字符串是"abac",然后我们找到"a",把它替换成\a,由于\是java转义字符,所以想表达\a必须写成"\\a",第一个反斜线将第二个反斜线转义成普通字符串。

三个替换表达式,只有第一个replace函数的结果是正确的,问题出在哪呢?

replaceAll和replaceFirst要求第一个参数是正则表达式,"a"既能理解成字符串a,也可以理解成正则表达式a,所以第一个参数没问题。

问题就出在第二个参数上,如果读者仔细阅读replaceAll函数的注释,会发现有如下说明:

Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use java.util.regex.Matcher.quoteReplacement to suppress the special meaning of these characters, if desired.

由于replaceAll和replaceFirst的第一个参数是正则,所以我们可以在第二个参数中做些小花样,比如有这样一个需求:把源字符串中的a替换成a后边紧邻的字符,代码如下:

System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //bbcc
System.out.println("abac".replaceFirst("a(\\w)", "$1$1")); //bbac

正则的含义假设读者可以读懂,可以看出,在第二个参数中,可以用$符号获取分组的内容,本例中用$1取到了第一个分组的内容,即a后边紧邻的字符。

因此,$符号在第二个参数中是有特殊含义的,乱写会报错:

System.out.println("abac".replaceAll("a(\\w)", "$")); //Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1

那假如我就想替换成$呢?这就需要转义字符:

System.out.println("abac".replaceAll("a", "\\$")); //$b$c

到这,读者可能会恍然大悟,原来反斜线在第二个参数中也有特殊含义(转义),所以如果我们想表达反斜线,就必须再转义一次:

System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac
System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac

简单理解一下,"\\\\a"中前边的反斜线分别转义后边的反斜线,让后边的反斜线就是普通字符串,这样在java内存中看到的字符串就是"\\a",然后replaceAll函数在处理时,再用前边的反斜线转义后边的反斜线,来表达后边的反斜线就是普通字符串,不是用来转义$的,最终内存中的字符串就是"\a",这样才可以成功将a替换成\a。

总结

转义的问题确实纠结,通过本文,笔者希望读者以后使用这些函数时,能够保持清醒,能够意识到参数中的特殊字符,避免写出定时炸弹。以上就是这篇文章的全部内容,希望对大家的学习和工作能有所帮助,如果有疑问可以留言交流。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, replace
, replaceall
, replaceFirst
first
replacefirst的用法、js中replaceall的用法、replaceall用法、java replaceall用法、replaceall的用法,以便于您获取更多的相关知识。

时间: 2024-12-21 08:17:46

Java中replace、replaceAll和replaceFirst函数的用法小结_java的相关文章

java中hashCode方法与equals方法的用法总结_java

首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了.但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了. 也就是说,如果集合中现在已经有

浅谈java中replace()和replaceAll()的区别_java

replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串): 2)replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号; 相同点:都是全部替换,即把源字符串中的某一字符

基于Java中Math类的常用函数总结_java

Java中比较常用的几个数学公式的总结: //取整,返回小于目标函数的最大整数,如下将会返回-2 Math.floor(-1.8): //取整,返回发育目标数的最小整数 Math.ceil() //四舍五入取整 Math.round() //计算平方根 Math.sqrt() //计算立方根 Math.cbrt() //返回欧拉数e的n次幂 Math.exp(3); //计算乘方,下面是计算3的2次方 Math.pow(3,2); //计算自然对数 Math.log(); //计算绝对值 Mat

java数组-java中关于Sqrt()函数

问题描述 java中关于Sqrt()函数 import java.math.*; public class Test { public static void main(String[] args) { BigDecimal b1 = new BigDecimal(Math.sqrt(5)-1,new MathContext(100)); BigDecimal b2 = new BigDecimal(2,new MathContext(100)); BigDecimal result = b1.

java中为什么main函数调用别的函数必须先实例化,实例化的目的是什么?

问题描述 java中为什么main函数调用别的函数必须先实例化,实例化的目的是什么? java中为什么main函数调用别的函数必须先实例化,实例化的目的是什么? 解决方案 估计是你的函数忘了加static,加了就可以直接调用了,比如 int add(int a, int b) { ... } -> static int add(int a, int b) { ... } 解决方案二: 初始化一个对象啊,只有对象才能调用其它的函数,如果不实例化那么这个函数必须是静态函数 解决方案三: 要想调用函数

JavaScript中常见的字符串操作函数及用法汇总_javascript技巧

本文实例总结了JavaScript中常见的字符串操作函数及用法.分享给大家供大家参考.具体分析如下: 最近几次参加前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等.如果你经常参加笔试或者也是一个过来人,相信你也跟我一样,发现字符串的处理是前端招聘过程中最常见的题型之一.这些题有一个特点,站在考官的角度去考虑,它考的不是你会不会,而是你能不能在不借用XX手册或者XX指南再或者百度谷歌的情况下,用比较简洁的方式写出答案来.可惜的是,很多开发人员,当然我也

java中的小问题关于\t的用法

问题描述 java中的小问题关于t的用法 在java中/t是TAB的意思及作用,但是t在java中怎么用,什么意思? 解决方案 t=空格,n=换行 解决方案二: t就是制表符,相当于我们按 tab键,"t"这样用就行了.

Java中replace和replaceAll的区别

replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串); 2)replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号; 相同点是都是全部替换,即把源字符串中的某一字符

Java FP: Java中函数式编程的谓词函数(Predicates)第二部分

在上一篇文章中我们介绍了谓词函数.通过一个简单的只带一个返回值是true或者false的函数的接口,把函数式编程语言的优势带入到了类似Java的面向对象编程语言中.这一小节,我们将会介绍一些高级特性,方便你高效利用谓词函数. 测试 在测试代码中使用谓词的优势尤为明显.当你需要测试一个混合了数据结构与某些条件逻辑的方法时,通过使用谓词,你可以先单独测试数据结构,再测试条件逻辑. 第一步,先利用永真谓词或者永假谓词屏蔽用于判断的逻辑,将注意力集中在测试数据结构上: 1 // check with t