小编典典

正则表达式截断尾随零

java

我正在尝试构造一个正则表达式(用于Java)以截断小数点后的零。例如

  • 50.000→50
  • 50.500→50.5
  • 50.0500→50.05
  • -5→-5
  • 50→50
  • 5.5→5.5

想法是以最紧凑的形式表示实数(或整数)。

这是我构造的:

^(-?[.0-9]+?)\.?0+$

$1用来捕获截断的数字字符串。

上面的模式的问题是50被截断为5。我需要某种方式来表示0+必须遵循.(小数点)。
我尝试过使用负数落后,但没有任何匹配。


阅读 321

收藏
2020-11-26

共1个答案

小编典典

最好的解决方案可能是针对该任务使用特定于语言的内置方法。

如果您无法使用它们,则可以使用

^(-?\d+)(?:\.0+|(\.\d*?)0+|\.+)?$

并替换为$1$2

请参阅regex演示。相应地调整正则表达式。这里是解释:

  • ^ -字符串开始
  • (-?\d+) -组1捕获1或0减符号,然后捕获1或多个数字
  • (?:\.0+|(\.\d*?)0+|\.+)?-一个 可选的 (由于拖尾而匹配1或0次?)非捕获组,与3个替代方案匹配:
    • \.0+ -小数点后跟1+零
    • (\.\d*?)0+ -第2组使用任意0+数字捕获点,并尽可能少并匹配1+零
    • \.+-( 可选分支,如果不需要,您可以将其删除 )-匹配尾随点
  • $ -字符串结尾。

Java演示

String s = "50.000\n50\n50.100\n50.040\n50.\n50.000\n50.500\n50\n-5";
System.out.println(s.replaceAll("(?m)^(-?\\d+)(?:\\.0+|(\\.\\d*?)0+|\\.+)?$", "$1$2"));
// => [50, 50, 50.1, 50.04, 50, 50, 50.5, 50, -5]
2020-11-26