什么字符串替换Java API(模板库)可用于进行条件和自定义字符串替换?

时间:2017-10-12 20:04:13

标签: java substitution

我正在寻找一个开源Java API,它允许我根据自定义标签进行可配置的字符串替换。

示例模板:

Your did something<ACTION_DATETIME '" at "HH:mm AM" on "MM/dd/yyyy'> in[ {CITY}, {STATE}][ {ZIP5}]. Your's truly, [ {FIRST_INITIAL}][ {LAST_NAME}].

<ACTION_DATETIME '" at "MM/dd/yyyy" on "HH:mm AM'>告诉我们使用的日期和所述日期的格式。

[ {CITY}, {STATE}]告诉我们将城市和州置于此处,如果任一字段为空,则排除方括号之间的所有内容

示例结果:

Your did something at 1:32 PM on 10/13/2017 on in Mansfield, OH 44906. Your's truly, J Tully.

我已经获得了使用正则表达式和常规字符串替换部分构建的解决方案,但是我希望能够提供更强大且预先构建的解决方案。

我看过Commons Lang3的StrSubstitutor,虽然它处理简单和自定义替换,但它似乎没有更多的语法驱动替换。

更新#1

目前停留在Java 1.6上。

1 个答案:

答案 0 :(得分:1)

我认为@TinkerTenorSoftwareGuy建议使用模板库是最佳选择。有很多,我稍微使用Freemarker

基本上你有一个模板:

You did ${action} at ${date} in ${city} ${state} ${zip}. Yours truly, ${firstName} ${lastName}.

包含数据的模型(java类):

class MyTemplate extends StringTemplate {

    public MyTemplate(String action, Date date, /* etc */ ) { /* set the model state */ }

    public String getTemplateFileLocation() { /* point to the template file */ }

    public String process() { /* process the template and return the string */ }

    public String getAction() { /* return the action as a string */ }

    public String getDate() { /* return the formatted date as a string, i.e. */ 
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        return df.format(date);
    }

    public String getCity() { /* return the city as a string */ }

    public String getState() { /* return the state as a string */ }

    public String getZip() { /* return the zip code as a string */ }

    public String getFirstName() { /* return the first name as a string */ }

    public String getLastName() { /* return the last name as a string */ }
}

然后在您的代码中,您可以实例化模板并对其进行处理。处理模板会替换模板中${firstName}的实例,并在模型中返回getFirstName()的值(依此类推,对于每个变量):

StringTemplate template = new MyTemplate(action, date, city, state, zip, firstName, lastName);
String letter = template.process();

现在letter包含使用模型中的值填充的模板。

有很多不同的模板库,但这是基本的想法。