Java中replace、replaceAll和replaceFirst函数的用法小结
首先概述一下他们三个的用法:
· 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 thespecial 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函数的用法小结相关推荐
- Java中原生(native)函数的用法
1.原生(Native)函数的概念 在Java程序中,可以使用由其他编程语言实现的函数,这种函数,在Java中被称之为 原生(Native)函数. 2.在Java程序中使用原生函数的优缺点 1)优点 ...
- java里的进制转换函数_基于Java中进制的转换函数详解
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- JavaScript中常见的字符串操作函数及用法汇总
转载地址:http://www.jb51.net/article/65358.htm 这篇文章主要介绍了JavaScript中常见的字符串操作函数及用法,实例汇总了javascript常见的字符串转换 ...
- java中判断list是否为空的用法(亲测)
1.如果想判断list是否为空,可以这么判断: if(null == list || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 2.list.isEmp ...
- Matlab中print, fprint, fscanf, disp函数的用法
最近一直在用python,导致学习的一些函数就有点混淆,趁着这会儿看代码,就再回顾下Matlab中print, fprint, fscanf, disp函数的用法 一.print() 函数可以把函数图 ...
- java中replace()和replaceAll()区别
replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...
- JAVA中REPLACE和REPLACEALL的区别(转)
replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...
- java中replace和replaceAll的区别
replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...
- Java中的Random()函数 【转载】
今天在做Java练习的时候注意到了Java里面的一个随机函数--Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结: Java中 ...
最新文章
- 理论计算机科学中最令人困惑的谜题之一被解开
- 组合查询——怎样使用窗口的继承达到事半功倍?
- ASP.NET常用的26个优化性能方法
- std::string的split函数
- obs噪音抑制调多少合适_TVS瞬态抑制二极管的特性及应用
- 作者:刘强(1990-),男,中国科学院自动化研究所博士生
- Browser增加下载路径选择功能
- java中特殊流程控制语句,深入分析JAVA流程控制语句
- 创业基础-乐训课堂-李家华-答案
- 大数据第一季--java基础(day22)-徐培成-专题视频课程
- SPSS应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。
- 养肾=养命!这5个养肾方法,程序员都保存好了!
- C语言——函数定义及用法【内部函数外部函数内联函数】
- 开源/免费的视频会议:openmeetings的详细安装步骤
- byte转16进制字符串<——>16进制转byte
- 输入数字的汉语拼音,每个拼音的首字母大写。输出该数字的阿拉伯数字。
- 【解决方案】摄像机户外直播能在哪些地方运用?团建/项目启动会/户外婚礼等户外直播方案介绍
- java基础巩固-宇宙第一AiYWM:为了维持生计,Spring全家桶_Part1-5(学学Spring源码呗:BeanFactory与ApplicationContext的暗潮涌动与争风吃醋)~整起
- 企业如何选择合适的精益生产方案?
- wordpress 高并发_HyperDB的高可用性WordPress
热门文章
- Java PriorityQueue poll()方法与示例
- 富士施乐2022网络扫描设置_富士施乐(FUJI XEROX)全系列复印机产品介绍
- java控制台打印图片_java——控制台输入打印图形
- js导出的xlsx无法打开_js-xlsx 导出表格至excel
- dcom配置_spring cloud 二代架构依赖组件 全配置放送
- 顶级Javaer,常用的 14 个类库
- 硬核|定时任务的10种实现方案,满足你的不同需求!
- IDEA 终于支持中文版和 JDK 直接下载了(太方便了)附新版介绍视频
- 最详细的 IDEA调试教程
- python自己做个定时器_python 创建一个自己的类计时器