Java 匹配表达式并替换

Java 匹配表达式并替换,java,regex,replace,Java,Regex,Replace,我有一个这样的字符串-${username}我想匹配${username}并用值Tom替换它。我正在尝试下面的代码和许多其他,但没有成功 String str = "This-is-${username}"; System.out.println(str.replaceAll("[/^${*}$/]", "Tom")); 编辑:在${}之间可以有任何值当前它的用户名在${}之间,您必须使用: str.replaceAll("\\$\\{username\\}", "Tom") 注意转义的{和

我有一个这样的字符串-${username}我想匹配${username}并用值Tom替换它。我正在尝试下面的代码和许多其他,但没有成功

String str = "This-is-${username}";
System.out.println(str.replaceAll("[/^${*}$/]", "Tom"));
编辑:在${}之间可以有任何值当前它的用户名在${}

之间,您必须使用:

str.replaceAll("\\$\\{username\\}", "Tom")
注意转义的{和}字符

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

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

\\$-匹配$符号 \\{匹配一个大括号 [^}]+-一次或多次匹配除大括号外的任何内容 \\}-匹配右括号 注:

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

str.replaceAll("\\$\\{username\\}", "Tom")
注意转义的{和}字符

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

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

\\$-匹配$符号 \\{匹配一个大括号 [^}]+-一次或多次匹配除大括号外的任何内容 \\}-匹配右括号 注:

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

输出

This-is-Tom
This-is-Tom-again
使用\\$\{[^}]*\}

输出

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

好吧,虽然这个想法在某种程度上是正确的,但你编写正则表达式的方式却不是

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

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

str.replaceAll("\\$\\{[^}]*}", "Tom")
您需要逃逸$,否则它将意味着“行尾”


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

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

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

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

str.replaceAll("\\$\\{[^}]*}", "Tom")
您需要逃逸$,否则它将意味着“行尾”

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

这样做

String str = "This-is-${username}";
System.out.println(str.replaceAll("\\$\\{username\\}", "Tom"));
你喜欢这样吗

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

通过将您试图匹配的模式放置在字符类[]中,它将匹配此处的每个字符。即使从角色类中删除模式,它也将无法匹配

您根本不需要分隔符,您可以删除字符串“^”的开头和字符串$anchors的结尾,因为您的模式不在数据中的任何位置。量词并没有做你认为在这种情况下是什么

您可以使用以下命令,必须在此处转义\\文本$,和{

说明:

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

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

您根本不需要分隔符,您可以删除字符串“^”的开头和字符串$anchors的结尾,因为您的模式不在数据中的任何一个位置。而且*量词的作用与您认为的不同

您可以使用以下命令,必须在此处转义\\文本$,和{

说明:

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

是否要替换${SOMETHING}类型的子字符串或仅替换${username}类型的子字符串?是否要替换${SOMETHING}类型的子字符串或仅替换${username}类型的子字符串?