Java regexp删除Freemarker FTL标记

Java regexp删除Freemarker FTL标记,java,regex,freemarker,Java,Regex,Freemarker,我试图创建一个regexp来忽略字符串中的Freemarker FTL标记。 我有一个带有文本的模板,例如“嗨,[#if gender=“Male”]Mr[#elseif]Mrs[/#if]${name}我为您提供了一个特别优惠。” 我只想替换FTL标记,所以只替换具有[#something]模式的标记:我使用方括号语法 理想情况下,我应该调用“myString.replaceAll”(“regex”)和“” 但是我找不到正确的regexp来使用 替换后我希望获得的最后一个字符串结果是“嗨,Mr

我试图创建一个regexp来忽略字符串中的Freemarker FTL标记。 我有一个带有文本的模板,例如
“嗨,[#if gender=“Male”]Mr[#elseif]Mrs[/#if]${name}我为您提供了一个特别优惠。”

我只想替换FTL标记,所以只替换具有
[#something]
模式的标记:我使用方括号语法

理想情况下,我应该调用“
myString.replaceAll”(“regex”)和“”

但是我找不到正确的regexp来使用


替换后我希望获得的最后一个字符串结果是
“嗨,Mr${name}我为您提供了一个特别优惠。”

以下模式应该满足您的期望:

\[/?\(.+?)\]

测试用例:

public class Test {

    private static final String PATTERN = "\\[/?#(.+?)\\]";
    private static final String TEXT = "Hi, [#if gender=\"Male\"]Mr[#elseif]Mrs[/#if] ${name} I've a special offer for you.";

    public static void main(String[] args) {
        String out = TEXT.replaceAll(PATTERN, "");
        System.out.println(out);
    }

}
输出:
您好,${name}女士,我为您提供了一个特别优惠。

以下模式应该满足您的期望:

\[/?\(.+?)\]

测试用例:

public class Test {

    private static final String PATTERN = "\\[/?#(.+?)\\]";
    private static final String TEXT = "Hi, [#if gender=\"Male\"]Mr[#elseif]Mrs[/#if] ${name} I've a special offer for you.";

    public static void main(String[] args) {
        String out = TEXT.replaceAll(PATTERN, "");
        System.out.println(out);
    }

}
输出:
您好,${name}女士,我有一个特别优惠给您。

这样就可以了:

public static void main(String[] args) {
    String template = "<html>[BR]\n"
                      + "<head>[BR]\n"
                      + "  <title>Welcome!</title>[BR]\n"
                      + "</head>[BR]\n"
                      + "<body>[BR]\n"
                      + "  [#-- Greet the user with his/her name --][BR]\n"
                      + "  <h1>Welcome ${user}!</h1>[BR]\n"
                      + "  <p>We have these animals:[BR]\n"
                      + "  <ul>[BR]\n"
                      + "  [#list animals as animal][BR]\n"
                      + "    <li>${animal.name} for ${animal.price} Euros[BR]\n"
                      + "  [/#list][BR]\n"
                      + "  </ul>[BR]\n"
                      + "</body>[BR]\n"
                      + "</html>";

    System.out.println("************ORIGINAL TEMPLATE**************");
    System.out.println(template);
    System.out.println("************REPLACED TEMPLATE**************");
    System.out.println(template.replaceAll("\\[/?#(.*?)\\]", "\u001B[33mREPLACEMENT\u001B[0m"));
}
publicstaticvoidmain(字符串[]args){
字符串模板=“[BR]\n”
+“[BR]\n”
+“欢迎![BR]\n”
+“[BR]\n”
+“[BR]\n”
+“[#--用他的/她的名字问候用户--][BR]\n”
+“欢迎${user}![BR]\n”
+“我们有这些动物:[BR]\n”
+“
    [BR]\n” +“[#将动物列为动物][BR]\n” +“
  • ${animal.price}欧元的${animal.name}[BR]\n” +“[/#列表][BR]\n” +“
[BR]\n” +“[BR]\n” + ""; System.out.println(“*************原始模板****************”); System.out.println(模板); System.out.println(“*************替换模板****************”); System.out.println(template.replaceAll(“\\\[/?\(.*?\\])”,“\u001B[33mREPLACEMENT\u001B[0m”); }
这应该可以做到:

public static void main(String[] args) {
    String template = "<html>[BR]\n"
                      + "<head>[BR]\n"
                      + "  <title>Welcome!</title>[BR]\n"
                      + "</head>[BR]\n"
                      + "<body>[BR]\n"
                      + "  [#-- Greet the user with his/her name --][BR]\n"
                      + "  <h1>Welcome ${user}!</h1>[BR]\n"
                      + "  <p>We have these animals:[BR]\n"
                      + "  <ul>[BR]\n"
                      + "  [#list animals as animal][BR]\n"
                      + "    <li>${animal.name} for ${animal.price} Euros[BR]\n"
                      + "  [/#list][BR]\n"
                      + "  </ul>[BR]\n"
                      + "</body>[BR]\n"
                      + "</html>";

    System.out.println("************ORIGINAL TEMPLATE**************");
    System.out.println(template);
    System.out.println("************REPLACED TEMPLATE**************");
    System.out.println(template.replaceAll("\\[/?#(.*?)\\]", "\u001B[33mREPLACEMENT\u001B[0m"));
}
publicstaticvoidmain(字符串[]args){
字符串模板=“[BR]\n”
+“[BR]\n”
+“欢迎![BR]\n”
+“[BR]\n”
+“[BR]\n”
+“[#--用他的/她的名字问候用户--][BR]\n”
+“欢迎${user}![BR]\n”
+“我们有这些动物:[BR]\n”
+“
    [BR]\n” +“[#将动物列为动物][BR]\n” +“
  • ${animal.price}欧元的${animal.name}[BR]\n” +“[/#列表][BR]\n” +“
[BR]\n” +“[BR]\n” + ""; System.out.println(“*************原始模板****************”); System.out.println(模板); System.out.println(“*************替换模板****************”); System.out.println(template.replaceAll(“\\\[/?\(.*?\\])”,“\u001B[33mREPLACEMENT\u001B[0m”); }
示例str的replaceAll之后的预期输出是什么?您想保留“Mr/Mrs”还是只显示${name},如
嗨,${name}
?我编辑了这个问题以澄清我期望的最终结果。谢谢示例str的replaceAll之后的预期输出是什么?您想保留“Mr/Mrs”吗或者只显示${name},比如
Hi,${name}
?我编辑了这个问题以澄清我期望的最终结果。感谢该模式将接受[]范围内的任何内容,而不仅仅是[#].此外,.+?可能只是。*您对#部分的看法是正确的,并将编辑答案。另一方面,替换+?for*不会产生相同的结果。也就是说,对于给定的字符串,它将返回
Hi,${name}我为您提供了一个特别优惠。
您说得对,添加?会给表达增加热切的前瞻性该模式将在[]范围内接受任何内容,而不仅仅是[#].此外,.+?可能只是。*您对#部分的看法是正确的,并将编辑答案。另一方面,替换+?for*不会产生相同的结果。即,对于给定字符串,它将返回
Hi,${name}我为您提供了一个特别优惠。
您是对的,添加?将为表达式添加热切的展望