简介:适用于主表明细表数据,通过自定义模板,展现定制内容。
模拟例子:
~数据源
// 主信息
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|来界定变量,界定符不能为{}否则会和#{}引起冲突导致正则失败。