java 字符串正则替换(替换字符串包含匹配到的字符串)
“南风知我意,吹梦到西洲”
很多时候我们需要对文本进行替换,简单地使用replace方法就可以了。复杂的就需要使用正则;java提供了正则相关的类Pattern 和Matcher
- 基本语法这里就不在重复,不了解可以参考菜鸟教程:https://www.runoob.com/java/java-regular-expressions.html
基本写法如下
// 正则表达式String reg = "";// 需要匹配的字符串String str = "";// 预编译Pattern patten = Pattern.compile(reg);// 进行匹配Matcher matcher = patten.matcher(str);/*** matcher.find()为true表示匹配到,如果匹配到多个下一次循环偏移到下一个匹配* 每一次匹配可以理解为一组,从0开始*/while (matcher.find()) { // 疯狂操作// 利用start和end我们可以确定匹配到的字符串的位置// 当前匹配到的字符串的开始在原字符串的索引位置 matcher.start()// 当前匹配到的字符串的结尾在原字符串的索引位置matcher.end()// 当前匹配到的字符串matcher.group()// 替换第一次匹配的数据matcher.replaceFirst("");// 替换所有匹配的数据matcher.replaceAll("");}
这里说几个需要注意的地方
- 正则需要进行预编译:
阿里巴巴java开发手册中有提到:在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
我们尽量不要再方法里面定义:Pattern pattern = Pattern.compile(“规则”);如果定义在方法体内每次调用都会进行编译影响方法效率。 - replaceFirst()和replaceAll()方法:
这两个方法要么替换所有,要么只替换第一次限制太大了,只适用于某些特殊的场景, - start(), end(),group():
都可以传入一个int值取之前匹配的该方法内容,比如start(0)就表示第一次匹配到的字符串的开头在源字符串的位置
group(0)比较特殊它代表整个表达式
- 可以发现简单地替换不能满足我们的需求,正则还提供了两个替换的方法appendReplacement()和appendTail()
String chapterContent = ""String line = "<br/>";String regx = num_zh_str;Pattern pattern = Pattern.compile(regx);Matcher matcher = pattern.matcher(chapterContent);StringBuffer chapterContentLine = new StringBuffer();while (matcher.find()){boolean equals = line.equals(chapterContent.indexOf(matcher.start() - line.length()));if (!equals){matcher.appendReplacement(chapterContentLine,line + matcher.group());}else{matcher.appendTail(chapterContentLine);}}matcher.appendTail(chapterContentLine);content.append(chapterName).append(chapterContentLine.toString());
我的目的是在匹配的的字符串前面加一个换行符"<br/>",如果匹配字符前面已经有了换行符那就不要进行替换
matcher.group()就是匹配到的字符串,通过appendReplacement()方法将匹配的的字符串替换后,将字符串添加到一个StringBuffer中,这里appendReplacement()方法只将匹配到的字符串添加到StringBuffer中,如果之前有匹配到的也会添加到StringBuffer中,但是没有匹配到的是不会添加到StringBuffer中的。所有我们需要在下面在调用matcher.appendTail(),以确保没有匹配到的也添加到StringBuffer中
这样我们的目的就实现了,相比replaceXXX,appendXXX更灵活
java 字符串正则替换(替换字符串包含匹配到的字符串)相关推荐
- R语言str_subset函数和str_which函数:str_subset函数提取字符串向量中所有包含匹配字符的字符串、str_which函数返回字符串向量中所有包含匹配字符的位置(索引)
R语言str_subset函数和str_which函数:str_subset函数提取字符串向量中所有包含匹配字符的字符串.str_which函数返回字符串向量中所有包含匹配字符的位置(索引) 目录
- JS:正则表达式中的替换 replace(内容包含匹配模式)
replace()方法可以实现替换字符的操作,用来替换的参数可以是字符串或正则表达式. 语法格式: // 第一个参数:被替换的可以是字符串也可以是正则表达式 // 第二个参数:替换为新的字符串 // ...
- js替换html中的字符串,js怎么替换字符串?
在js中,可以使用str.replace()方法来替换字符串.replace()方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串:然后返回一个新的字符串. replace( ...
- python 正则式替换_python 正则表达式参数替换实例详解
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...
- java match正则不生效_[Java教程]正则表达式match()函数
[Java教程]正则表达式match()函数 0 2015-09-26 12:00:31 正则表达式match()函数: 此方法可在字符串内查找一个或多个正则表达式的匹配. 返回值是一个数组,但是此数 ...
- 正则匹配字符串有则替换无则添加;用正则实现添加和替换字符串,原字符串中包含某字段就替换(覆盖),不包含某字段就添加!
正则匹配字符串有则替换无则添加 一.首先确定我们的字符串文本例:有一个网上商城项目在书本的详细描述中有这样一段话:"这是一本某某写Java书共1000章.....[ 书本编号:107 ]&q ...
- [Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]
场景 在开发基于模板内容的Java程序时, 比如一个邮件内容模板,在内容里放置一些占位符$email,$name等来作为替换实际内容的符号.那么这时候如何做才可以少生成不必要的String字符串,从而 ...
- java 正则 不包含_java使用正则表达式匹配不包含某个规则的字符串
测试数据: 例如上面这几条简单的日志条目,我们想实现两个目标: 1.把8号的数据过滤掉: 2.把那些不包含robots.txt字符串的条目给找出来(只要Url中包含robots.txt的都给过滤掉). ...
- JAVA 操作字符串 分割、替换、截取操作
1.按指定字符分割 1.1 String belongPlace = "北京市,天津市,石家庄市";String[] placeName = belongPlace.split(& ...
最新文章
- 有关eigen库的一些基本使用方法
- 异常:System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(System.Guid)
- 使用 VNC 无屏幕远程连接树莓派
- Python程序设计之迭代器和生成器示例
- Python之单元测试
- UINavigationbar的背景修改方法集合
- 汉诺塔V - ACM解决方法
- 从零开始学习jQuery (三) 管理jQuery包装集【转】
- 支持向量机SVM的python实现
- ***的基础知识总结
- 魔方机器人需要特制魔方吗_火影忍者手游:如果新春水门金币团购,你会夸魔方良心吗?...
- 为什么我会被淘汰(续)
- BZOJ 3679 数位DP
- Django中QuerySet的结果是否为空的判断
- 采购人必须明白的八大发展趋势及原则
- ASP,PHP,ASPX生成静态页大全
- 计算机属性资源管理器已停止工作,经常出现“资源管理器已停止工作”怎么办的完美解决办法...
- 让Win7系统下的硬盘不在狂闪的诀窍【mfxp】
- Xenon's Attack on the Gangs Codeforces Round #614 (Div. 2)
- 与element-UI相媲美的前端UI组件库ArcoDesign 开源啦