使用正则表达式从浮动指针数字中去除尾随零



给定的输入,如:

123000
-123000
1.230000000
123.4000000
-123.4000000
123.0

是否有一个正则表达式将匹配非尾随零部分,相应地给出如下捕获?:

123000
-123000
1.23
123.4
-123.4
123.0

对于您的示例数据,您可以匹配一个或多个数字,一个点后面跟着零或多倍的数字d+.[0-9]*,这是贪婪的,将匹配到行的末尾,然后再匹配一个数字[1-9],以确保123.0这样的值不匹配。

然后使用K重置报告匹配的起点。任何消耗掉的东西都不再是比赛的一部分。然后匹配要使用0*删除的可能的零,并用空字符串替换这些零。

d+.[0-9]*[1-9]K0*

一个可能的候选者是
(?!00+)([+-]?d+(.d?)?)(0*[1-9])*

正如您可以在这个演示中测试的那样。

第一组是负前瞻,防止选择仅由两个或多个零组成的匹配字符串(00000或后面的字符串将匹配(

第二组匹配一个可选符号,后跟一个或多个数字,可选后跟一个文字点,可选一个数字(小数点后的第一个数字可以是零,如您在示例中所示(,然后跟在集合[1-9]中的一组0或多组数字后面,这些数字由一组零分隔(这保证数字终止于非零数字(

最后,您需要获得第二个组,它定义您感兴趣的子字符串。有关详细信息,请参阅演示。

更新

强制负前瞻位于左边的非单词边界,它不匹配链的最后零作为新的数字(连续的数字必须是不同的单词(,从而导致这个新的正则表达式:

(?!B00+)([+-]?d+(.d?)?)(0*[1-9])*

如demo2 中所示

一种解决方案是:^(-?d+(?:.d+?[1-9]*)?)0*$

  • (捕获组
    • -?可选-
    • d+一位或多位
    • (?:非捕获组
      • .d+?。后跟一个或多个数字(非贪婪(
      • [1-9]*零位或多个非零数字
    • )?可选匹配组
  • )
  • 0*零或多个零

您可以使用以下简单的正则表达式:

(.[^0]+)0+ 
and replace with 1

Regex Demo

注意:这将匹配小数点(点(后的所有0,但不匹配小数点后的那个

编辑:如果你想在捕获组1中获得所需的结果,你可以使用以下方法:

([^.s]+(?:.[^0]+)?)0*

Regex Demo

可能有十几种方法。我会尝试

-?(d+(?:.[1-9]d*?)?)0*$

最新更新