String类用到正则的方法及利用正则写的模板引擎

String类中方法用到的正则

  • replaceAll
  • replaceFirst
  • split
    上述方法若匹配正则表达式中的字符均需转义
    replace和replaceAll都是取代所有的字符。replace的第一个参数是字符串,replaceAll的第一个参数是正则表达式
    看一下replaceAll的源码
 public String replaceAll(String regex, String replacement) {
 //实质上调用的就是
        return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }

replace的源码,介绍之前先熟悉一下Pattern类中的匹配模式
单行模式(点号模式)、多行模式、大小写无关模式、特殊字符作为普通字符处理模式,它们对应的常量分别为:Pattern.DOTALL,Pattern.MULTILINE、Pattern.CASE_INSENSITIVE、Pattern.LITERAL,多个模式可以一起使用,通过’|'连起来即可。

Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL)

  public String replace(CharSequence target, CharSequence replacement) {
        return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
                this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
    }

Pattern.compile(target.toString(), Pattern.LITERAL)匹配时把正则特殊字符转为普通字符。
Matcher.quoteReplacement 匹配的结果特殊字符转为普通字符主要是$和\。

模板引擎

①logger中打印日志。
比如

//以{}来作为参数的替代
logger.info("###  输入的省份名provinceName{}",provinceName);

仿写:

 public static String moduleLogger(String str, Object... args) {
        //正则表达式
        String regx = "\\{\\}";
        Pattern pattern = Pattern.compile(regx);
        Matcher matcher = pattern.matcher(str);
         //只能用StringBuffer
        StringBuffer sb = new StringBuffer();
        //边查找边替换
        int foundNum=0;
        while (matcher.find()) {
            //可变参数的本质是数组
            matcher.appendReplacement(sb, Matcher.quoteReplacement(args[foundNum++].toString()));
        }
        //添加尾部
        matcher.appendTail(sb);
        return sb.toString();
    }

②使用Map中的value替换字符串中的{key}。
形如字符串:“Hi {name}, your code is {code}.”;

public static String templateEngine(String template, Map<String, String> paramsMap) {
    Pattern templatePattern = Pattern.compile("\\{(\\w+)\\}");
    StringBuffer sb = new StringBuffer();
    Matcher matcher = templatePattern.matcher(template);
    while (matcher.find()) {
        //取出key
        String key = matcher.group(1);
        //从对应的Map中获取value
        String value = paramsMap.get(key);
        matcher.appendReplacement(sb, value != null ?
                Matcher.quoteReplacement(value.toString()) : "");
    }
    matcher.appendTail(sb);
    return sb.toString();
}

测试

    String moduleStr = "###  输入的省份名provinceName为:{}"
    System.out.println(moduleLogger(moduleStr,"安徽"));
    
    String template = "Hi {name}, your code is {code}.";
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("name", "老马");
    params.put("code", 6789);
    System.out.println(templateEngine(template, params));

以上就是两个小例子了,有更好的例子请留言。

参考资料:

老马说编程

每篇一语

几时归去,作个闲人。对一张琴,一壶酒,一溪云。——《行香子·述怀》苏轼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值