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

时间:2012-03-02 00:19:16

标签: java regex

我正在尝试替换像:

这样的字符串
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<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);
    }

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

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

所以如何更改模式以接受$ {var}而不是{var}

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

在你的替换示例中,你忘了也逃避领先{以及$。

所以你需要这样做:

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