我有以下Java字符串replaceAll
函数,其正则表达式替换为格式为${var}
的零变量:
String s = "( 200828.22 +400000.00 ) / ( 2.00 + ${16!*!8!1} ) + 200828.22 + ${16!*!8!0}";
s = s.replaceAll("\\$\\{.*\\}", "0");
问题是结果字符串s
是:
"( 200828.22 +400000.00 ) / ( 2.00 + 0"
此代码有什么问题?
答案 0 :(得分:5)
将正则表达式更改为
\\$\\{.*?\\}
↑
*
greedy ,引擎会尽可能多地重复它,因此匹配{
,然后匹配所有内容,直到最后一个令牌。然后它开始回溯,直到它与}
之前的最后一个字符匹配。
例如,如果你有正则表达式
\\{.*\\}
和字符串
"{this is} a {test} string"
它匹配如下:
{
与第一个{
.*
会匹配所有内容,直到g
令牌}
t
,然后它可以匹配下一个}
匹配" {this is} a {test}" 为了使其不合适,您应该添加?
。通过这样做,它会变得懒惰并停止,直到遇到第一个}
。
正如评论中所提到的,另一种选择是[^}]*
。它匹配不 }
的任何内容(因为它放在character class中)。