Регулярное выражение в Java, чтобы заменить мои заполнители с данными hashmap - PullRequest
3 голосов
/ 07 февраля 2011

У меня есть шаблон с заполнителями

Dear [[user.firstname]] [[user.lastname]] 

Message [[other.msg]]

И у меня есть коллекция данных в Map

Map data = new HashMap();  
data.put("user.firstname","John");
data.put("user.lastname","Kannan");    
data.put("other.msg","Message goes here...");

Я хотел бы создать регулярное выражение Java для замены значения данных картысо связанным заполнителем (в пределах [[]]) в моем шаблоне.

Ответы [ 4 ]

10 голосов
/ 07 февраля 2011

Вы не можете сделать это с помощью одного регулярного выражения в Java, вам нужно обернуть его в какую-то логику.

Вот метод, который сделает это за вас:

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();

}
4 голосов
/ 07 февраля 2011

Зачем вам для этого регулярное выражение? Почему бы просто не сделать:

for (Map.Entry<String, String> replacement : data.entrySet()) {
    s = s.replace("[[" + replacement.getKey() + "]]", replacement.getValue());
}
1 голос
/ 07 февраля 2011

Я бы рекомендовал использовать метод 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);
0 голосов
/ 07 февраля 2011

итак, в чем проблема?

String text = "Dear [[user.firstname]] [[user.lastname]]";
for (String key : data.keySet()) {
    String pattern = key.replace("[", "\\[").replace("]", "\\");
    text = text.replaceAll(pattern, data.get(key));
}

Будьте осторожны с. Возможно, вам придется дублировать их, то есть написать \\ вместо \. Просто отладьте ваш код пару минут, и решение готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...