李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
正则表达式--替换操作和Rest()方法
Leefs
2019-12-29 PM
2211℃
0条
# 正则表达式--替换操作和Rest()方法 ### 前言 本篇讲述《Java编程思想》第13.6.6小节,替换操作和Rest()方法 ### 方法说明 正则表达式特别便于替换文本,它提供了许多方法: > + 1.replaceFirst(String replacement):以参数字符串replacement替换掉第一个匹配成功的部分; > + 2.**replaceAll**(String replacement):以参数字符串replacement替换所有匹配成功的部分; > + 3.appendReplacement(StringBuffer sbuf,String replacement):执行渐进式的替换,而不是像replaceFirst和replaceAll那样只替换第一个匹配或全部匹配这是一个非常重要的方法。它允许你调用其他方法来生成或处理replacement(replaceFirst()和replaceAll()则只能使用一个固定的字符串),使你能够以编程的方式将目标分割成组,从而具备更强大的替换功能。 > + 4.appendTail(StringBuffer sbuf):在执行了一次或多次appendReplacement()之后,调用此方法可以将输入字符串余下的部分复制到sbuf中。 ### 代码示例 ```java /*! Here's a block of text to use as input to the regular expression matcher. Note that we'll first extract the block of text by looking for the special delimiters, then process the extracted block. !*/ public class TheReplacements { public static void main(String[] args) { String s = TextFile.read("TheReplacements.java"); // Match the specially-commented block of text above: Matcher mInput =Pattern.compile("///*!(.*)!//*/", Pattern.DOTALL).matcher(s); if(mInput.find()){ s = mInput.group(1);// Captured by parentheses } // Replace two or more spaces with a single space: s = s.replaceAll(" {2,}", " "); // Replace one or more spaces at the beginning of each // line with no spaces. Must enable MULTILINE mode: s = s.replaceAll("(?m)^ +", ""); System.out.println(s); s = s.replaceFirst("[aeiou]", "(VOWEL1)"); StringBuffer sbuf = new StringBuffer(); Pattern p = Pattern.compile("[aeiou]"); Matcher m = p.matcher(s); // Process the find information as you // perform the replacements: while(m.find()) m.appendReplacement(sbuf, m.group().toUpperCase()); // Put in the remainder of the text: m.appendTail(sbuf); System.out.println(sbuf); } } ``` > 运行结果 ```java Here's a block of text to use as input to the regular expression matcher. Note that we'll first extract the block of text by looking for the special delimiters, then process the extracted block. ! H(VOWEL1)rE's A blOck Of tExt tO UsE As InpUt tO thE rEgUlAr ExprEssIOn mAtchEr. NOtE thAt wE'll fIrst ExtrAct thE blOck Of tExt by lOOkIng fOr thE spEcIAl dElImItErs, thEn prOcEss thE ExtrActEd blOck. ! ``` > 方法参数说明 **TextFile.read( ):**方法来打开和读取文件。 **static read():**方法读入整个文件,将其内容作为String对象返回。 **mInput:**用来匹配在`/*!`和 `!*/`之间的所有文字(注意一下分组用的括号) 接下来,将存在两个或两个以上空格的地方缩减为一个空格,并且删除每行开头部分的所有空格。(为了使每一行都达到这个效果,而不仅仅只是删除文本开头部分的空格,这里特意打开了多行状态)。这两个替换操作所使用的replaceAll()是String对象自带的方法,在这里,使用此方法更方便。(因为只使用了一次replaceAll(),与其便以为Pattern,不如直接使用String的replaceAll()方法,而且开销也更小些) replaceFirst()只对找到的第一个匹配进行替换。此外,replaceFirst()和replaceAll()方法用来替换的只是普通的字符串。 在这个例子中,先构造了sbuf用来保存最终结果,然后用group()选择一个组,并对其进行处理,将正则表达式找到的元音字母转换成大写字母。 一般情况下,应该遍历执行所有的替换操作,然后再调用appendTail()方法,但是,如果你想模拟replaceFirst()的行为,那就只需执行一次替换,然后调用appendTail()方法,将剩余未处理的部分存入sbuf即可。 同时,appendReplaceMent()方法还允许你通过$g直接找到匹配的某个组,这里的g就是组号。然而,它只能应付一些简单的处理,无法实现类似前面这个例子中的功能。 ### Rest()方法 通过rest()方法,可以将现有的Matcher对象应用于一个新的字符序列: ```java public class Resetting { public static void main(String[] args) { Matcher m = Pattern.compile("[frb][aiu][gx]").matcher("fix the rug with bags"); while(m.find()){ System.out.print(m.group()+" "); } System.out.println(); m.reset("fix the rug with bags"); while(m.find()){ System.out.print(m.group()+" "); } } } ``` > 运行结果 ```java fix rug bag fix rug bag ``` 使用不带参数的reset()方法,可以将Matcher对象重新设置到当前字符序列的起始位置。
标签:
Java
,
Java编程思想
,
字符串
,
正则表达式
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/344.html
上一篇
Java序列化和反序列化
下一篇
正则表达式--Java IO
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
MyBatis-Plus
Yarn
前端
Golang基础
nginx
NIO
排序
Eclipse
Java阻塞队列
Thymeleaf
机器学习
数据结构
Filter
gorm
Flume
Azkaban
HDFS
并发线程
Java编程思想
队列
Jquery
SpringBoot
国产数据库改造
GET和POST
Netty
查找
数学
Java工具类
MySQL
Golang
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭