Java正则表达式截断字符串

时间:2015-05-17 14:15:08

标签: java regex

我有以下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"

此代码有什么问题?

1 个答案:

答案 0 :(得分:5)

将正则表达式更改为

\\$\\{.*?\\}
        ↑

* greedy ,引擎会尽可能多地重复它,因此匹配{,然后匹配所有内容,直到最后一个令牌。然后它开始回溯,直到它与}之前的最后一个字符匹配。

例如,如果你有正则表达式

\\{.*\\} 

和字符串

"{this is} a {test} string" 

它匹配如下:

  • {与第一个{
  • 相匹配
  • .*会匹配所有内容,直到g令牌
  • 正则表达式无法匹配字符串
  • 中的最后}
  • 它会回溯到t,然后它可以匹配下一个}匹配" {this is} a {test}"

为了使其不合适,您应该添加?。通过这样做,它会变得懒惰并停止,直到遇到第一个}

正如评论中所提到的,另一种选择是[^}]*。它匹配 }的任何内容(因为它放在character class中)。