正则表达式截断尾随零

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

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

想法是以尽可能紧凑的forms表示实数(或整数)。

这就是我构建的内容:

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

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

上面的模式的问题是50被截断为5.我需要某种方式来表达0+必须遵循a . (小数点)。
我尝试过使用背负,但无法获得任何匹配。

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

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

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

并以$1$2取代。

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

  • ^ – 字符串的开头
  • (-?\d+) – 组1捕获1或0减去符号,然后捕获1个或多个数字
  • (?:\.0+|(\.\d*?)0+|\.+)? – 一个可选的 (匹配1或0次由于尾随? )非捕获组匹配3个备选方案:
    • \.0+ – 小数点后跟1 + 0
    • (\.\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] 

一般的正则表达式应该做的伎俩:

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

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

基本上:

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

\.*?? 十进制的可选匹配项。 喜欢匹配0次出现

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

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