获取模板内容里的参数-正则表达式

获取模板内容里的参数

(可直接看方案3,方案1和方案2皆存在问题)

需求:获取模板内容里的参数,比如模板内容为"我是{#name#} ,我今年{#age#}",获取的就是"name"和"age"

方案1:使用正则表达式  \{#(.*)#}

/**
     * 获取模板内容里的参数
     *
     * @return
     */
    public List<String>  getContentParam(String content){
        List<String> paramList =new ArrayList<>();
        String regex = "\{#(.*)#}";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(content);
        while(m.find()){
            paramList.add(m.group(1));
        }
        return paramList;
    }

发现以上正则表达式存在问题

比如模板内容为 "我是{#name#} ,我今年{#age#}" ,则匹配到的是"name#} ,我今年{#age" ,即第一个"{#"和最后一个"#}"之间的内容

 

使用方案2  

根据"{#" 截取字符串,从最后开始截取,将截取的子字符串使用 \{#(.*)#}来匹配,未截取的字符串进入下一次循环

 /**
     * 获取模板内容里的参数,参数格式为{#参数#}。如"我是{#name#},我今年{#age#}" 返回的参数集合list中包含两个元素:"name"和"age"
     * 
     * @return 参数集合  
     */
    public List<String>  getContentParam(String content){
        List<String> paramList =new ArrayList<>();
        String start = "{#";
        String regex = "\{#(.*)#}";
        int lastIndex ;
        String temp;
        String tempContent = content;
        Pattern p = Pattern.compile(regex);
        lastIndex = tempContent.lastIndexOf(start);
        while(lastIndex > 0){
            temp = tempContent.substring(lastIndex);
            Matcher m = p.matcher(temp);
            if (m.find()) {
                System.out.println(m.group(1));
                paramList.add(m.group(1));
            }
            tempContent = tempContent.substring(0,lastIndex);
            lastIndex = tempContent.lastIndexOf(start);
        }
        return paramList;
    }

方案2可行,但是如果模板内容不按常理来,比如为 "我是{#name#} ,我今年{#ag{#e#}" ,则应该截取的为 "name","ag{#e" ,但是使用方案二,截取的内容为"name","e"

不过方案2改一下是可以的,改成: 根据"#}" 截取字符串,从前面开始截取,将截取的子字符串使用 \{#(.*)#}来匹配,未截取的字符串进入下一次循环

 

使用方案3

使用正则表达式 \{#(.*?)#}

方案3与方案1 唯一不同之处是 正则表达式中有个?号

 /**
     * 获取模板内容里的参数
     *
     * @return
     */
    public List<String>  getContentParam(String content){
        List<String> paramList =new ArrayList<>();
        String regex = "\{#(.*?)#}";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(content);
        while(m.find()){
            paramList.add(m.group(1));
        }
        return paramList;
    }

方案3可行,如果模板内容为 "我是{#name#} ,我今年{#age#}" ,则匹配到的是"name"和"age" 

原文地址:https://www.cnblogs.com/kiko2014551511/p/11844506.html