简介:适用于主表明细表数据,通过自定义模板,展现定制内容。
模拟例子:
~数据源
// 主信息 Map<String, String> mainmap = new HashMap<String, String>(); mainmap.put("z", "animals"); // 从信息 Map<String, String> map1 = new HashMap<String, String>(); map1.put("x", "cat"); map1.put("y", "miaomiao"); Map<String, String> map2 = new HashMap<String, String>(); map2.put("x", "dog"); map2.put("y", "wangwang"); Map<String, String> map3 = new HashMap<String, String>(); map3.put("x", "pig"); map3.put("y", "hengheng"); List<Map<String, String>> list = new ArrayList<Map<String, String>>(); list.add(map1); list.add(map2); list.add(map3);
~自定义模板
String template = "$z singing\n#{$xs - $y...\n}end";
~定制程序片
for (String key : mainmap.keySet()) { template = template.replaceAll("\\$" + key, mainmap.get(key)); } Pattern p = Pattern.compile("\\#\\{([^\\}]*)\\}"); Matcher m = p.matcher(template); StringBuffer sb = new StringBuffer(); while (m.find()) { String forstr = m.group(1); StringBuffer replacestr = new StringBuffer(); for (Map<String, String> map : list) { String tmp = forstr; for (String key : map.keySet()) tmp = tmp.replaceAll("\\$" + key, map.get(key)); replacestr.append(tmp); } m.appendReplacement(sb, replacestr.toString()); } m.appendTail(sb); System.out.println(sb.toString());
~运行结果
animals singing cats - miaomiao... dogs - wangwang... pigs - hengheng... end
注:同事在使用过程中发现,若存在$a和$aa的变量时,需要注意替换的顺序。
或者安全起见可以使用$|a|和$|aa|来界定变量,界定符不能为{}否则会和#{}引起冲突导致正则失败。