正则表达式截断尾随零

时间:2016-06-15 07:09:50

标签: java regex

我正在尝试构造一个单一的正则表达式(用于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+必须遵循.(小数点)。
我尝试过使用背负,但无法获得任何匹配。

2 个答案:

答案 0 :(得分:2)

最佳解决方案可能是使用内置语言特定的方法来完成该任务。

如果您不能使用它们,您可以使用

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

并替换为$1$2

请参阅regex demo。相应地调整正则表达式。以下是解释:

  • ^ - 字符串开头
  • (-?\d+) - 第1组捕获1或0减号,然后是1位或更多位数
  • (?:\.0+|(\.\d*?)0+|\.+)? - 可选(由于尾随?匹配1或0次)非捕获组匹配3个备选项:
    • \.0+ - 小数点后跟1+零
    • (\.\d*?)0+ - 第2组捕获任意0位数但尽可能少且匹配1+零的点
    • \.+ - (可选分支,如果不需要,可以将其删除) - 匹配尾随点
  • $ - 字符串结束。

Java demo

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]

答案 1 :(得分:1)

对于应该做的一般正则表达式:

^\d+?0*\.??\d*?(?=0*?[^\d]*$)

您可以将插入符号和美元符号替换为您的边界。这些可能会被您对数字的期望所取代。

基本上是:

/d+?任意数字的非贪婪匹配(至少需要1个数字才能开始比赛)

\.*??小数的可选匹配项。喜欢匹配0次出现

\d*? (?=0*?[^\d]*$) - 非贪婪的数字匹配,但会停在0,由非数字

编辑:我刚刚意识到原始表达式也修整了整数的最后一个零,这应该可行。我添加了选项0匹配以捕获