“南风知我意,吹梦到西洲”


很多时候我们需要对文本进行替换,简单地使用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("");}

这里说几个需要注意的地方

  1. 正则需要进行预编译:
    阿里巴巴java开发手册中有提到:在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
    我们尽量不要再方法里面定义:Pattern pattern = Pattern.compile(“规则”);如果定义在方法体内每次调用都会进行编译影响方法效率。
  2. replaceFirst()和replaceAll()方法:
    这两个方法要么替换所有,要么只替换第一次限制太大了,只适用于某些特殊的场景,
  3. 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 字符串正则替换(替换字符串包含匹配到的字符串)相关推荐

  1. R语言str_subset函数和str_which函数:str_subset函数提取字符串向量中所有包含匹配字符的字符串、str_which函数返回字符串向量中所有包含匹配字符的位置(索引)

    R语言str_subset函数和str_which函数:str_subset函数提取字符串向量中所有包含匹配字符的字符串.str_which函数返回字符串向量中所有包含匹配字符的位置(索引) 目录

  2. JS:正则表达式中的替换 replace(内容包含匹配模式)

    replace()方法可以实现替换字符的操作,用来替换的参数可以是字符串或正则表达式. 语法格式: // 第一个参数:被替换的可以是字符串也可以是正则表达式 // 第二个参数:替换为新的字符串 // ...

  3. js替换html中的字符串,js怎么替换字符串?

    在js中,可以使用str.replace()方法来替换字符串.replace()方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串:然后返回一个新的字符串. replace( ...

  4. python 正则式替换_python 正则表达式参数替换实例详解

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...

  5. java match正则不生效_[Java教程]正则表达式match()函数

    [Java教程]正则表达式match()函数 0 2015-09-26 12:00:31 正则表达式match()函数: 此方法可在字符串内查找一个或多个正则表达式的匹配. 返回值是一个数组,但是此数 ...

  6. 正则匹配字符串有则替换无则添加;用正则实现添加和替换字符串,原字符串中包含某字段就替换(覆盖),不包含某字段就添加!

    正则匹配字符串有则替换无则添加 一.首先确定我们的字符串文本例:有一个网上商城项目在书本的详细描述中有这样一段话:"这是一本某某写Java书共1000章.....[ 书本编号:107 ]&q ...

  7. [Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]

    场景 在开发基于模板内容的Java程序时, 比如一个邮件内容模板,在内容里放置一些占位符$email,$name等来作为替换实际内容的符号.那么这时候如何做才可以少生成不必要的String字符串,从而 ...

  8. java 正则 不包含_java使用正则表达式匹配不包含某个规则的字符串

    测试数据: 例如上面这几条简单的日志条目,我们想实现两个目标: 1.把8号的数据过滤掉: 2.把那些不包含robots.txt字符串的条目给找出来(只要Url中包含robots.txt的都给过滤掉). ...

  9. JAVA 操作字符串 分割、替换、截取操作

    1.按指定字符分割 1.1 String belongPlace = "北京市,天津市,石家庄市";String[] placeName = belongPlace.split(& ...

最新文章

  1. 有关eigen库的一些基本使用方法
  2. 异常:System.Runtime.InteropServices.Marshal.GetTypeFromCLSID(System.Guid)
  3. 使用 VNC 无屏幕远程连接树莓派
  4. Python程序设计之迭代器和生成器示例
  5. Python之单元测试
  6. UINavigationbar的背景修改方法集合
  7. 汉诺塔V - ACM解决方法
  8. 从零开始学习jQuery (三) 管理jQuery包装集【转】
  9. 支持向量机SVM的python实现
  10. ***的基础知识总结
  11. 魔方机器人需要特制魔方吗_火影忍者手游:如果新春水门金币团购,你会夸魔方良心吗?...
  12. 为什么我会被淘汰(续)
  13. BZOJ 3679 数位DP
  14. Django中QuerySet的结果是否为空的判断
  15. 采购人必须明白的八大发展趋势及原则
  16. ASP,PHP,ASPX生成静态页大全
  17. 计算机属性资源管理器已停止工作,经常出现“资源管理器已停止工作”怎么办的完美解决办法...
  18. 让Win7系统下的硬盘不在狂闪的诀窍【mfxp】
  19. Xenon's Attack on the Gangs Codeforces Round #614 (Div. 2)
  20. 与element-UI相媲美的前端UI组件库ArcoDesign 开源啦

热门文章

  1. 骁龙870和麒麟9000哪个好 骁龙870和麒麟9000对比哪个性能强
  2. iOS UITableView 禁止上下滑动
  3. Random类Dome01 nextInt()方法
  4. 使用zxing批量生成二维码立牌
  5. 2020年南京理工大学计算机推免面试
  6. xlsx如何查找替换_Excel如何批量查找和替换?
  7. 关于STLink在Keil无法烧录仿真的问题及解决办法总结。
  8. 基于android的记账本APP源码,后台springboot框架
  9. python3 爬虫 爬取智联招聘岗位信息
  10. 正大国际琪貨召主涨户:国债期货的投资模式是什么