代码之家  ›  专栏  ›  技术社区  ›  ScrappyDev

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

  •  0
  • ScrappyDev  · 技术社区  · 7 年前

    我正在寻找一个开源的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

    1 回复  |  直到 4 年前
        1
  •  1
  •   Matt    7 年前

    我认为@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 包含用模型中的值填充的模板。

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