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

Joh*_*lin 5 java regex

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

Hello, my name is ${name}. I am ${age} years old.
Run Code Online (Sandbox Code Playgroud)

Hello, my name is Johannes. I am 22 years old.
Run Code Online (Sandbox Code Playgroud)

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

private void replace() {
        HashMap<String, String> replacements = new HashMap<String, String>();
        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);
    }
Run Code Online (Sandbox Code Playgroud)

工作正常,但我想替换 ${var} 而不是 {var}。将其更改为 Pattern.compile("\${(.+?)\}"); 将抛出 PatternSyntaxException:“非法重复”。

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

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

Kon*_*kiy 4

大多数正则表达式库中都保留了 { 字符,以便沿着{n,m}. 尝试正则表达式

\\$\\{(.+?)\\}
Run Code Online (Sandbox Code Playgroud)

  • 无论如何,在大多数情况下都不是这样。(仅)Java对此很挑剔,大多数其他人并不关心。仅当它可以被解释为范围运算符时,才需要对其进行转义。 (2认同)