用动态内容替换特殊字符

时间:2017-12-01 09:45:08

标签: java regex string replace replaceall

嘿伙计们!

我在替换由特殊字符组成的字符串时遇到了困难。

所以我有一个以下字符串例如:

  

亲爱的* | customer_name | *,

     

感谢您的订单* | order_id | *。

     

请期待送货* | delivery_date | *

我想要的是用值替换这些动态变量。

我已经完成了这段代码,但它没有正确替换它们:

Map<String, String> structMap = getContectMap();
    for (String key : structMap.keySet()) {
        if (bodyText.contains(key)) {
            bodyText.replaceAll(getVariableKey(key), structMap.get(key));
        }
    }

private String getVariableKey(Object key) {
    return "\\*|" + key + "|\\*";
}

这是我得到的输出:

  

尊敬的用户|用户|用户,

     

感谢您的订单1236 | 1236 | 1236。

     

请期待发货5.12.2017 | 5.12.2017 | 5.12.2017

任何想法我做错了什么?

*编辑* 发现了一个问题。我也应该逃避管道字符(|),现在工作。

1 个答案:

答案 0 :(得分:1)

我建议您使用模板引擎,而不是尝试重新发明轮子。

模板引擎可帮助您根据模板和数据生成文档。

有几个很好的Java框架可用于生成文档,我建议您检查以下两个:

  • Apache Velocity:易于使用,具有良好的文档和社区
  • Jasper Reports:您可以使用此工具生成TXT,PDF,DOC,EXCEL,HTML等文档,它有一个非常好的模板编辑器应用程序。

修改

如果您真的想要使用自己的模板引擎,那么这可以是一个解决方案:

public static void main(String[] args) {
    String template = "Dear CUSTOMER_NAME, \n\n"
            + "Thank you for your order ID is ORDER_ID.\n"
            + "Please expect delivery DELIVERY_DATE.";


    Date deliveryDate = new Date();
    String deliveryDateString = new SimpleDateFormat("dd/MM/yyyy").format(deliveryDate);


    Map<String, String> keywords = new HashMap<>();
    keywords.put("CUSTOMER_NAME", "Zappee");
    keywords.put("ORDER_ID", "123456");
    keywords.put("DELIVERY_DATE", deliveryDateString);

    for (Map.Entry<String, String> keyword : keywords.entrySet()) {
        template = template.replaceAll(keyword.getKey(), keyword.getValue());
    }

    System.out.println(template);
}

输出:

Dear Zappee, 

Thank you for your order ID is 123456.
Please expect delivery 01/12/2017.