输入字符串:
<#if (${val1}-${val2}) + ${f1(${a}+${b}*${c})} > 2000>ABC<#elseif ${n1}+${n2}* ${f1(${n3}-${n4})} < 500>DEF</#if>
我们希望删除${
和}
中存在的所有<#if
和<#elseif
,f1()
除外${
{与f1
相关联的{1}}也应被删除)。因此,预期的输出字符串是:
<#if (val1-val2) + f1(${a}+${b}*${c}) > 2000>ABC<#elseif n1+n2*f1(${n3}-${n4}) < 500>DEF</#if>
答案 0 :(得分:1)
此问题是此问题中向"regex-match a pattern, excluding..."
解释的技术的典型案例我们可以通过一个非常简单的正则表达式解决它:
f1\([^)]*\)|(\$\{|\})
交替|
的左侧匹配完成f1( things )
。我们将忽略这些匹配。右侧匹配并捕获${
和}
到组1,我们知道它们是正确的,因为它们与左侧的表达式不匹配。
该程序显示了如何使用正则表达式:
Pattern regex = Pattern.compile("f1\\([^)]*\\)|(\\$\\{|\\})");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "");
else m.appendReplacement(b, m.group(0) );
}
m.appendTail(b);
String replaced = b.toString();
System.out.println(replaced);
参考
答案 1 :(得分:0)
正则表达式:
(?<=if \(|elseif )\$\{([^}]*)\}([+-])\$\{([^}]*)\}
的更换:
\1\2\3
您的代码将是,
String s1 = "<#if (${val1}-${val2}) + ${f1(${a}+${b}*${c})} > 2000>ABC<#elseif ${n1}+${n2}* ${f1(${n3}-${n4})} < 500>DEF</#if>";
String m1 = s1.replaceAll("(?<=if \\(|elseif )\\$\\{([^}]*)\\}([+-])\\$\\{([^}]*)\\}", "$1$2$3");
String m2 = m1.replaceAll("\\$\\{(f1[^)]*\\))\\}", "$1");
System.out.println(m2);
输出:
<#if (val1-val2) + f1(${a}+${b}*${c}) > 2000>ABC<#elseif n1+n2* f1(${n3}-${n4}) < 500>DEF</#if>
第一个replaceAll
方法会移除${}
和if
之后的elseif
。第二个replaceAll
方法会移除围绕${}
的{{1}}个符号。