【发布时间】:2011-09-21 00:17:24
【问题描述】:
这是从字符串中删除尾随小数和零的正确正则表达式吗?我无法让它工作。我错过了什么?
- 78.000 -> 78
- 78.008 -> 78.008
str.replaceAll("^.0*$", "");
【问题讨论】:
这是从字符串中删除尾随小数和零的正确正则表达式吗?我无法让它工作。我错过了什么?
str.replaceAll("^.0*$", "");
【问题讨论】:
您需要转义.,因为它是正则表达式中匹配任何字符的特殊字符。您还必须删除固定在数字开头的^。
str.replaceAll("\\.0*$", "");
如果您想确保点前面有一个数字,您可以使用lookbehind,如下所示:
str.replaceAll("(?<=^\\d+)\\.0*$", "");
lookbehind((?<=...) 部分)不是匹配的一部分,因此不会被替换,但它仍然必须匹配,才能匹配正则表达式的其余部分。
【讨论】:
+ 或 *。此外,您可能应该改进最后一句话的措辞 - 后视 can 是匹配的一部分,它只是匹配一个位置而不是一个字符(在这种情况下,该位置在匹配之前)。可以使用str.replaceAll("(?<=whatever)","stuff") 之类的方法在匹配后附加文本。
{0,99} 或{1,99}。现在我很困惑。 ://
Integer.MAX_VALUE 短。此外,+ 实现为 {1,0x7FFFFFFF}。因此,由于后视中只有一个字符 (\d),因此它可以工作。但如果我再添加一个,比如here,它就会失败。
\d* 工作。做\d+ 工作。执行\d\d* 会引发错误“后视组在索引 8 附近没有明显的最大长度”ideone.com/6mRfk
不。使用这个:
str.replaceAll("[.0]+$", "");
【讨论】:
2.000.000 的东西被转换成2
2.000
去掉匹配字符串开头的^。您还需要转义 .,因为它是匹配任何字符(换行符除外)的正则表达式元字符:
str.replaceAll("\\.0*$", "");
【讨论】:
str.replaceAll("\\.*0*$", "") 适用于“78.0000”、“78.08”和“78.80000”。
0 之后只有一个*,您之前也有一个。