java 字符串正则替换(替换字符串包含匹配到的字符串)

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


很多时候我们需要对文本进行替换,简单地使用replace方法就可以了。复杂的就需要使用正则;java提供了正则相关的类Pattern 和Matcher

		// 正则表达式
		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更灵活

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值