Java regexp删除Freemarker FTL标记
我试图创建一个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
“嗨,[#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}我为您提供了一个特别优惠。
您是对的,添加?将为表达式添加热切的展望