java正则表达式:替换$ {var}

我正在尝试替换字符串,如:

Hello, my name is ${name}. I am ${age} years old. 

 Hello, my name is Johannes. I am 22 years old. 

变量存储在HashMap中。 我的代码到目前为止:

 private void replace() { HashMap replacements = new HashMap(); replacements.put("name", "Johannes"); replacements.put("age", "22"); String text = "Hello, my name is {name}. I am {age} years old."; Pattern pattern = Pattern.compile("\\{(.+?)\\}"); Matcher matcher = pattern.matcher(text); StringBuilder builder = new StringBuilder(); int i = 0; while (matcher.find()) { String replacement = replacements.get(matcher.group(1)); builder.append(text.substring(i, matcher.start())); if (replacement == null) { builder.append(""); } else { builder.append(replacement); i = matcher.end(); } } builder.append(text.substring(i, text.length())); System.out.println(builder); } 

这很好,但我想替换$ {var}而不是{var}。 将其更改为Pattern.compile(“\ $ {(。+?)\}”); 将抛出PatternSyntaxException:“Illeagal重复”。

转义$(Pattern.compile(“\\ $ {(。+?)\}”)将导致编译错误。

那么如何更改我的模式以接受$ {var}而不是{var}

{字符在大多数正则表达式库中保留,以便在{n,m}的行中重复。 试试正则表达式

 \\$\\{(.+?)\\} 

尝试转义大括号以避免非法重复错误。

从这里被盗:{和}特别适用于Java的正则表达方言(以及大多数其他方言):它们是重复量词{n,m}的开始和结束标记,其中n和m是整数。 因此错误消息:“非法重复”。

在您的替换示例中,您忘记了也逃脱了领先{以及$。

所以你需要这样做:

 Pattern.compile("\\$\\{(.+?)\\}");