zoukankan      html  css  js  c++  java
  • 获取模板内容里的参数-正则表达式

    获取模板内容里的参数

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

  • 相关阅读:
    学习C++的第一天
    2016.12.28
    无主之地
    一种排序
    街区最短问题
    配对类问题
    蛇形填数
    c#unity
    贪心
    台阶
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/11844506.html
Copyright © 2011-2022 走看看