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(); }
|
代码寻找所有的模板变量,正则表达式为:
‘{
‘是元字符,所以要转义。\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下。下一节,我们讨论和分析一些常见的正则表达式。