Matcher和Pattern的运用

316 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

在工作中经常会遇到发送短信或者替换模板内容的需求,最开始都是定义好一段话,然后都是用String类提供的replace方法进行内容的替换,但是这样写复用性不强。每次有个新的模板都需要重新写replace方法。因此就想到了正则表达式的用法,正好util包提供了相应的方法。下面就来看看这解方法是怎么应用的把。

package com.wounler.helloword.demo;

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

/*
 * 获取功能:
 * 获取下面这个字符串中的占位符
 * 
 */
public class RegexDemo {
    public static void main(String[] args) {
        // 定义字符串
        String s = "尊敬的${custName}客户,您好,您于${year}年${month}月${day}日申请的贷款已通过审批。";
        // 规则
        String regex = "\$\{(.*?)\}";
        // 把规则编译成模式对象 p: "${(.*?)}"   regex: "${(.*?)}"
        Pattern p = Pattern.compile(regex);
        // 通过模式对象得到匹配器对象
        Matcher m = p.matcher(s);
        // 调用匹配器对象的功能
        // 通过find方法就是查找有没有满足条件的子串
        // 注意:一定要先find(),然后才能group()
        // IllegalStateException: No match found
        //String group() 
        //返回当前查找而获得的与组匹配的所有子串内容 
        //String group(int group) 
        //返回当前查找而获得的与指定的组匹配的子串内容
        //Pattern对象中的parentPattern->capturingGroupCount 记录了字串数量
        while (m.find()) {
            System.out.println(m.group());//输出:${custName} ${year} ${month} ${day}
            System.out.println(m.group(1));//输出:custName year month day
        }
    }
}

以下为实战应用:用了下面的方法真是谁爽谁知道

package com.wounler.helloword.demo;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * 获取功能:
 * 消息模板替换
 */
public class RegexDemo {
    public static void main(String[] args) {
        // 定义字符串
        String s = "尊敬的${custName}客户,您好,您于${year}年${month}月${day}日申请的贷款已通过审批。";
        RegexDemo regexDemo = new RegexDemo();
        Map<String ,String> map = new HashMap<>();
        map.put("custName","wounler");
        Calendar now = Calendar.getInstance();
        map.put("year",String.valueOf(now.get(Calendar.YEAR)));
        map.put("month",String.valueOf(now.get(Calendar.MONTH)+1));
        map.put("day",String.valueOf(now.get(Calendar.DAY_OF_MONTH)));
        String s1 = regexDemo.msgTpltParamsReplace(s, map);
        System.out.println(s1);//尊敬的wounler客户,您好,您于2022年8月15日申请的贷款已通过审批。
    }

    public  String msgTpltParamsReplace(String msgTplt, Map<String, String> params){
        for (String match : getMatchList(msgTplt)){
            if(params.containsKey(match)){
                String value = params.get(match);
                msgTplt = msgTplt.replace("${" + match + "}",value);
            }
        }
        return msgTplt;
    }

    public  List<String> getMatchList(String msgTplt) {
        List<String> list = new ArrayList<>();
        // 规则
        String regex = "\$\{(.*?)\}";
        // 把规则编译成模式对象 p: "${(.*?)}"   regex: "${(.*?)}"
        Pattern p = Pattern.compile(regex);
        // 通过模式对象得到匹配器对象
        Matcher m = p.matcher(msgTplt);
        // 调用匹配器对象的功能
        while (m.find()) {
            list.add(m.group(1));
        }
        return list;
    }
}