我有一个带占位符的模板
Dear [[user.firstname]] [[user.lastname]]
Message [[other.msg]]
我在地图中收集了数据
Map data = new HashMap();
data.put("user.firstname","John");
data.put("user.lastname","Kannan");
data.put("other.msg","Message goes here...");
我想创建一个Java正则表达式,用我的模板上的关联占位符([[]]
)替换地图数据值。
答案 0 :(得分:10)
你无法在Java中单独使用regex,你需要将它包装在一些逻辑中。
以下是为您执行此操作的方法:
public static String replaceValues(final String template,
final Map<String, String> values){
final StringBuffer sb = new StringBuffer();
final Pattern pattern =
Pattern.compile("\\[\\[(.*?)\\]\\]", Pattern.DOTALL);
final Matcher matcher = pattern.matcher(template);
while(matcher.find()){
final String key = matcher.group(1);
final String replacement = values.get(key);
if(replacement == null){
throw new IllegalArgumentException(
"Template contains unmapped key: "
+ key);
}
matcher.appendReplacement(sb, replacement);
}
matcher.appendTail(sb);
return sb.toString();
}
答案 1 :(得分:4)
为什么你需要这个正则表达式?为什么不简单地做:
for (Map.Entry<String, String> replacement : data.entrySet()) {
s = s.replace("[[" + replacement.getKey() + "]]", replacement.getValue());
}
答案 2 :(得分:1)
我建议使用appendReplacement
方法:
Map<String, String> data = new HashMap<String, String>();
...
Pattern p = Pattern.compile("\\[\\[([a-zA-Z.]+)\\]\\]");
Matcher m = p.matcher("Dear [[user.firstname]] [[user.lastname]]");
StringBuffer sb = new StringBuffer();
while (m.find()) {
String reg1 = m.group(1);
String value = data.get(reg1);
m.appendReplacement(sb, Matcher.quoteReplacement(value == null ? "" : value));
}
m.appendTail(sb);
答案 3 :(得分:-1)
那么,问题是什么?
String text = "Dear [[user.firstname]] [[user.lastname]]";
for (String key : data.keySet()) {
String pattern = key.replace("[", "\\[").replace("]", "\\");
text = text.replaceAll(pattern, data.get(key));
}
小心。可能你必须复制它们,即写\\而不是\。只需几分钟调试您的代码,解决方案就可以了。