2016-06-15 100 views
2

我想构造一个正则表达式(对于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+必须遵循.(小数点)。
我试过使用负面后,但不能得到任何比赛。

+0

'^( - ?[\。0-9] +?)(\。0 +)?'' –

+0

像这样:[regex 101](https:// regex101 .com/r/aJ5kC1/1)? –

+1

您正在使用哪种语言? –

回答

2

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

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

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

而且随着$1$2取代。

查看regex demo。相应地调整正则表达式。下面是解释:

  • ^ - 串
  • (-?\d+) -Group 1捕捉1个或0减去符号的开始,然后1个或多个数字
  • (?:\.0+|(\.\d*?)0+|\.+)? - 一个可选(匹配1或0次由于拖尾?)非捕获组匹配3个备选方案:
    • \.0+ - 一个小数点,接着用1+零
    • (\.\d*?)0+ - 第2组捕获点与任何0+数字,但尽可能少和匹配1+零
    • \.+ - (可选分支,你可以删除它,如果没有必要) - 相匹配的尾随点(S )
  • $ - 字符串结尾。

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] 
+0

这里是[更新的演示](https://regex101.com/r/nF6rY3/2)链接。 –

+0

@WingPoon:如果输入是'-5',你期望得到什么?它里面没有小数部分。据我记得,你需要删除*小数部分*尾随零,或者你改变了主意,现在想匹配所有的尾部零? –

+0

您必须将该要求添加到问题中。使用['^( - ?\ d +)(?:\。0+ |(\。\ d *?)0+ | \。+)?$'](https://regex101.com/r/wH5qA8/ 1)。你使用的是什么方法/代码? –

1

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

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

您可以替换无论你的边界应该是插入符号和美元符号。这些可以取代你期望的数字。

基本上:

/d+?非贪婪匹配用于任何数目的(至少需要1号开始比赛)为一个十进制

\.*??可选匹配。倾向于匹配0次出现

\d*? (?=0*?[^\d]*$) - 非贪婪匹配一个数字,而是将在其通过非数字

编辑进行0止损:我才意识到原来的表达也修剪整数最后为零,这应该工作。我添加了选项0 match to catch that