【问题标题】:Match expression and replace匹配表达式和替换
【发布时间】:2013-12-18 07:27:03
【问题描述】:

我有一个类似This-is-${username} 的字符串,我想匹配${username} 并将其替换为值Tom。我正在尝试以下代码和许多其他但没有成功。

String str = "This-is-${username}";
System.out.println(str.replaceAll("[/^${*}$/]", "Tom"));

编辑:${} 之间可以有任何值,目前它的用户名在${} 之间

【问题讨论】:

  • 您要替换${SOMETHING} 类型的任何子字符串还是只替换${username}

标签: java regex replace


【解决方案1】:

使用\\$\\{[^}]*\\}

String pattern = "\\$\\{[^}]*\\}";

String str1 = "This-is-${username}";
System.out.println(str1.replaceAll(pattern, "Tom"));


String str2 = "This-is-${something}-again";
System.out.println(str2.replaceAll(pattern, "Tom"));

输出

This-is-Tom
This-is-Tom-again

【讨论】:

    【解决方案2】:

    通过将您尝试匹配的模式放在字符类[] 中,它会匹配这里的每个字符。即使从字符类中删除模式,它也将无法匹配。

    您根本不需要分隔符的/,您可以删除字符串^ 的开头和字符串$ 的结尾锚,因为您的模式不在数据中的任何位置。在这种情况下,* 量词并没有按照您的想法进行。

    您可以使用以下内容,您必须将\\ 转义为文字$,并在此处转义{

    String str = "This-is-${username}";
    System.out.println(str.replaceAll("\\$\\{[^}]*}", "Tom"));
    
    // => "This-is-Tom"
    

    Working demo

    解释:

    \$        '$'
    \{        '{'
     [^}]*    any character except: '}' (0 or more times)
    }         '}'
    

    【讨论】:

      【解决方案3】:

      好吧,虽然这个想法有点朝着正确的方向,但您编写正则表达式的方式却不是。

      [/^${*}$/] 是一个字符类,将匹配/^${*}$/ 中的任何一个,这意味着它等价于[/^${*}]

      更好的可能是这个正则表达式:

      str.replaceAll("\\$\\{[^}]*}", "Tom")
      

      您需要转义 $,否则它将意味着“行尾”。

      [^}] 是一个否定类,将匹配除右括号之外的所有字符。

      【讨论】:

        【解决方案4】:

        你必须使用:

        str.replaceAll("\\$\\{username\\}", "Tom")
        

        注意转义的 {} 字符。

        如果您想替换\\${someString} 形式的任何字符串,您应该使用:

        str.replaceAll("\\$\\{[^}]+\\}", "Tom")
        

        解释:

        • \\$ - 匹配 $ 符号
        • \\{ - 匹配左大括号
        • [^}]+ - 匹配任何东西,除了花括号,一次或多次
        • \\} - 匹配右大括号

        注意:

        • 由于{}$ 是特殊的正则表达式字符,您必须在正则表达式中使用\ 对它们进行转义,以将它们匹配为字符串。
        • 我们在" 中使用\\,因为在java 中"\\" 产生字符串\

        【讨论】:

          【解决方案5】:

          这样做

          String str = "This-is-${username}";
          System.out.println(str.replaceAll("\\$\\{username\\}", "Tom"));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-16
            相关资源
            最近更新 更多