栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Java]

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Java]

场景
  1. 在开发基于模板内容的Java程序时, 比如一个邮件内容模板,在内容里放置一些占位符$email,$name等来作为替换实际内容的符号。那么这时候如何做才可以少生成不必要的String字符串,从而减少内存占用达到一次过替换完的目的呢?
说明
  1. 作为不可变字符串String,使用它的replace方法替换会生成新的字符串,这个String很明显不合适的,所以得使用可变字符串。

  2. 可变字符串使用StringBuilder或者StringBuffer都可以.并且他们都有一个replace(start, end, str)和indexOf(str, fromIndex)方法。这样的话最基本的做法就是indexOf搜索到每个占位符,之后再替通过replace这个方法来替换掉占位符。

  3. 具体的做法是使用一个新的StringBuffer(StringBuilder)作为临时存储, 搜索到的占位符添加到这个新的StringBuffer里,其他非占位符也按顺序添加到这个StringBuffer。最后这个StringBuffer就可以作为新的替换后的字符串。

  4. 在Java的标准库里,使用Regex正则可以简单实现上边的方案。就是通过Matcher的appendReplacement[1]方法添加不匹配的字符串和替代字符串,之后再用appendTail添加剩余的不匹配字符串即可, 详细看例子.

  5. 待解决问题: Java的正则没有找到可以设置多个值的办法.

例子
  1. 方法使用了一个Map来匹配符合的字符串,之后用关联的值来替换它。
package com.example.string;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.jupiter.api.Test;

public class StringReplaceTest {


    public static void replaceOneMore(StringBuffer output, String input,
                                      String oldRegex, Map oldToNew){
        Pattern p = Pattern.compile(oldRegex);
        Matcher m = p.matcher(input);
                                            
        while (m.find()) {
            String one = m.group();
            if(oldToNew.containsKey(one))
                m.appendReplacement(output, oldToNew.get(one));
        }
        m.appendTail(output);
    }

    public static void print(String key,T t){
        System.out.println(key +" : "+t);
    }

    @Test
    public void testReplaceStringByRegexOrPredicate(){
        StringBuffer sb = new StringBuffer();
        HashMap oldTonew = new HashMap<>();
        oldToNew.put("$name","Tobey");
        oldToNew.put("$email","test@gmail.com");
        String registertemplate = "my name is $name, my email is $email, you can send to email to $email.";
        replaceOneMore(sb,registertemplate,"[$]name|[$]email",oldToNew);
        print("New String is: ",sb.toString());
    }



}

输出
New String is:  : my name is Tobey, my email is test@gmail.com, you can send to email to test@gmail.com.
参考
  1. Matcher Java Platform SE 8

  2. can-i-replace-groups-in-java-regex

  3. 正则表达式 问号 冒号 ?:使用_hxkjnet360的专栏

  4. 正则表达式中问号(?)的用法详解_小敏哥的专栏

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340071.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号