25.3 模板引擎

25.3 模板引擎

利用Java API尤其是Matcher中的几个方法,我们可以实现一个简单的模板引擎。模板是一个字符串,中间有一些变量,以{name}表示,比如:

1
String template = "Hi {name}, your code is {code}.";

这里,模板字符串中有两个变量:一个是name,另一个是code。变量的实际值通过Map提供,变量名称对应Map中的键,模板引擎的任务就是接受模板和Map作为参数,返回替换变量后的字符串,示例实现为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static Pattern templatePattern = Pattern.compile("\\{(\\w+)\\}");
public static String templateEngine(String template,
Map<String, Object> params) {
StringBuffer sb = new StringBuffer();
Matcher matcher = templatePattern.matcher(template);
while(matcher.find()) {
String key = matcher.group(1);
Object value = params.get(key);
matcher.appendReplacement(sb, value ! = null
Matcher.quoteReplacement(value.toString()) : "");
}
matcher.appendTail(sb);
return sb.toString();
}

代码寻找所有的模板变量,正则表达式为:

1
\{(\w+)\}

{‘是元字符,所以要转义。\w+表示变量名,为便于引用,加了括号,可以通过分组1引用变量名。

使用该模板引擎的示例代码为:

1
2
3
4
5
6
7
public static void templateDemo() {
String template = "Hi {name}, your code is {code}.";
Map<String, Object> params = new HashMap<String, Object>();
params.put("name", "老马");
params.put("code", 6789);
System.out.println(templateEngine(template, params));
}

输出为:

1
Hi 老马, your code is 6789.

完整代码在github上,地址为 https://github.com/swiftma/program-logic ,位于包shuo. laoma.regex.c89下。下一节,我们讨论和分析一些常见的正则表达式。