Java 在replaceAll调用中修改正则表达式的一部分

Java 在replaceAll调用中修改正则表达式的一部分,java,regex,replaceall,Java,Regex,Replaceall,我尝试使用正则表达式格式化字符串,如下所示: String string = "5.07+12.0+2.14"; string = string.replaceAll("\\.0[^0-9]",""); 我认为将会发生的是字符串将变成: 5.07+122.14 //the regex will delete the .0+ next to the 12 如何创建正则表达式,使其只删除而不删除+号 我更愿意在同一个通话中执行所有操作以“替换所有” 感谢您的建议匹配的字符将被替换。因此,您可以使

我尝试使用正则表达式格式化字符串,如下所示:

String string = "5.07+12.0+2.14";
string = string.replaceAll("\\.0[^0-9]","");
我认为将会发生的是字符串将变成:

5.07+122.14 //the regex will delete the .0+ next to the 12
如何创建正则表达式,使其只删除而不删除+号

我更愿意在同一个通话中执行所有操作以“替换所有”


感谢您的建议

匹配的字符将被替换。因此,您可以使用lookahead,而不是匹配末尾的非数字,它将执行所需的检查,但不会使用任何字符。此外,非数字的简写形式是
\D
,这比
[^0-9]
更易于阅读:

String string = "5.07+12.0+2.14";
string = string.replaceAll("\\.0(?=\\D)","");
如果要替换所有尾随零(例如,将
5.00
替换为
5
,而不是
50
,这可能是您不想要的),则使用
+
重复0一次或多次,以确保小数点后的所有零都被替换:

String string = "5.07+12.000+2.14";
string = string.replaceAll("\\.0+(?=\\D)","");
如果字符串从不包含字母或下划线
\uuu
字符(这些字符和数字字符都算作单词字符),那么您可以使用单词边界(而不是向前看)使其更漂亮。单词边界听起来会将一个位置与一侧的单词字符和另一侧的非单词字符相匹配,与
\b
:

string = string.replaceAll("\\.0+\\b","");

为什么5.07会变为57,因为.0后面跟一个数字@certainPerformance或者你可以使用负前瞻
\.0(?!\d)
符号的含义是什么?
(?=
是前瞻开始的语法。它检查以下模式是否匹配,但不使用任何字符。(像结束任何组一样结束前瞻,使用
)因此它应该只替换第一个组,而不是前瞻?右-前瞻不使用任何字符,它只确保以下模式匹配。感谢您的提示。我将在netbeans中测试它们,然后对您的答案进行投票。