从具有某种特定模式的字符串中删除$ {和}

时间:2014-07-18 08:30:11

标签: java regex

输入字符串:

<#if (${val1}-${val2}) + ${f1(${a}+${b}*${c})} > 2000>ABC<#elseif ${n1}+${n2}* ${f1(${n3}-${n4})} < 500>DEF</#if>

我们希望删除${}中存在的所有<#if<#elseiff1()除外${ {与f1相关联的{1}}也应被删除)。因此,预期的输出字符串是:

<#if (val1-val2) + f1(${a}+${b}*${c}) > 2000>ABC<#elseif n1+n2*f1(${n3}-${n4}) < 500>DEF</#if>

2 个答案:

答案 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

DEMO

您的代码将是,

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}}个符号。

IDEONE