繁体   English   中英

Java正则表达式截断字符串

[英]Java regular expression truncates string

我有以下带有正则表达式的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"

此代码有什么问题?

将您的正则表达式更改为

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

*贪婪的 ,引擎会重复它多次,因此它匹配{ ,然后匹配所有内容,直到最后一个标记。 然后,它开始回溯,直到与}之前的最后一个字符匹配。

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

\\{.*\\} 

和字符串

"{this is} a {test} string" 

匹配如下:

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

为了使其变得不贪心,您应该添加一个? 这样,它将变得很懒,直到遇到第一个}为止。

如评论中所述,替代方法是[^}]* 它与任何 }匹配(因为它已放置在字符类中 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM