匹配表达式并替换

时间:2013-12-18 07:27:03

标签: java regex replace

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

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

修改:${}当前用户名${}

之间可以有任何值

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

嗯,虽然这个想法有点朝着正确的方向,但你写正则表达式的方式并非如此。

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

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

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

你需要逃避$,否则就意味着“行尾”。

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

答案 2 :(得分:3)

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

您根本不需要分隔符/,您可以删除字符串^的开头和字符串$锚点的结尾,因为您的模式不在数据的任何位置。并且*量词在这种情况下没有做你认为的那样。

您可以使用以下内容,您必须在此处\\文字${。{/ p>

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

// => "This-is-Tom"

请参阅Working demo

说明:

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

答案 3 :(得分:2)

你必须使用:

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

请注意转义的{}字符。

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

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

解释:

  • \\$ - 匹配$标志
  • \\{ - 匹配一个大括号
  • [^}]+ - 匹配任何东西,但是大括号,一次或多次
  • \\} - 匹配一个大括号

注意:

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

答案 4 :(得分:0)

喜欢这个

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