首页 > 其他 > 详细

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

时间:2019-12-04 10:26:43      阅读:59      评论:0      收藏:0      [点我收藏+]

获取模板内容里的参数

(可直接看方案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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!