我有以下replaceAll
带有正则表达式的Java字符串函数,该正则表达式用format的零变量替换${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}”为了使其变得不太贪婪,您应该添加一个?
。这样,它将变得很懒,直到}
遇到第一个都停止。
如评论中所提到的,一种替代方法是[^}]*
。它匹配任何这不是 }
(因为它是放置在一个字符类)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句