获取模板内容里的参数
(可直接看方案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"