【问题标题】:java regex: replace ${var}java 正则表达式:替换 ${var}
【发布时间】:2012-03-20 13:01:32
【问题描述】:

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

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:“非法重复”。

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

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

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 不是在大多数情况下,反正在这种情况下。 (仅限)Java 对此很挑剔,其他大多数人都不在乎。只有当它可以被解释为范围运算符时,它才需要被转义。
      • 嗨,康斯坦丁,你能查看我的相关帖子吗:stackoverflow.com/questions/13075425/…。谢谢
      【解决方案3】:

      在您的替换示例中,您忘记同时转义前导 { 以及 $。

      所以你需要这样做:

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

      【讨论】:

        猜你喜欢
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多