如何替换Java字符串中的一组令牌?

2022-08-31 09:19:46

我有以下模板字符串:."Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"

我还有用于名称,发票编号和截止日期的字符串变量 - 用变量替换模板中的令牌的最佳方法是什么?

(请注意,如果变量碰巧包含令牌,则不应将其替换)。


编辑

感谢@laginimaineb和@alan-moore,这是我的解决方案:

public static String replaceTokens(String text, 
                                   Map<String, String> replacements) {
    Pattern pattern = Pattern.compile("\\[(.+?)\\]");
    Matcher matcher = pattern.matcher(text);
    StringBuffer buffer = new StringBuffer();

    while (matcher.find()) {
        String replacement = replacements.get(matcher.group(1));
        if (replacement != null) {
            // matcher.appendReplacement(buffer, replacement);
            // see comment 
            matcher.appendReplacement(buffer, "");
            buffer.append(replacement);
        }
    }
    matcher.appendTail(buffer);
    return buffer.toString();
}

答案 1

我真的不认为你需要使用模板引擎或类似的东西。您可以使用 String.format 方法,如下所示:

String template = "Hello %s Please find attached %s which is due on %s";

String message = String.format(template, name, invoiceNumber, dueDate);

答案 2

最有效的方法是使用匹配器不断查找表达式并替换它们,然后将文本附加到字符串生成器:

Pattern pattern = Pattern.compile("\\[(.+?)\\]");
Matcher matcher = pattern.matcher(text);
HashMap<String,String> replacements = new HashMap<String,String>();
//populate the replacements map ...
StringBuilder builder = new StringBuilder();
int i = 0;
while (matcher.find()) {
    String replacement = replacements.get(matcher.group(1));
    builder.append(text.substring(i, matcher.start()));
    if (replacement == null)
        builder.append(matcher.group(0));
    else
        builder.append(replacement);
    i = matcher.end();
}
builder.append(text.substring(i, text.length()));
return builder.toString();