使用正则表达式从浮动指针号中删除尾随零

时间:2018-07-17 09:13:55

标签: regex floating-point pcre strip

给出如下输入:

123000
-123000
1.230000000
123.4000000
-123.4000000
123.0

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

123000
-123000
1.23
123.4
-123.4
123.0

5 个答案:

答案 0 :(得分:1)

对于您的示例数据,您可以匹配一个或多个数字,点后跟零或多个零的数字\d+\.[0-9]*,这是贪婪的,并且匹配到行的末尾,然后匹配数字{{1 },以确保不匹配123.0之类的值。

然后使用[1-9]重设所报告比赛的起点。消耗的所有物品不再是比赛的一部分。然后使用\K匹配要删除的可能零,并用空字符串替换。

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

答案 1 :(得分:1)

可能的候选人是

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

您可以在此demo中进行测试。

第一组为负前瞻,可防止选择仅由两个或多个零组成的匹配字符串(00000,否则将匹配尾随字符串)

第二组匹配一个可选的符号,后跟一个或多个数字,后跟一个文字点和一个可选的数字(在示例中,小数点后的第一个数字可以为零),然后跟集合[1-9]中的一组0个或多个数字组,并用一组零分隔(这保证该数字以一个非零数字结尾)

最后,您需要获得第二组,该组界定了您感兴趣的子字符串。有关详细信息,请参见demo

更新

将否定的前瞻强制在左侧的非单词边界处,它不匹配链的最终零,因为新的数字(连续的数字必须是不同的单词)导致出现以下新的正则表达式:

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

demo2

中可以看到

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

(\.[^0]+)0+ 

and replace with \1

Regex Demo

注意:这将匹配小数点后的所有0,而不是小数点后的所有

编辑:如果要在捕获组1中获得所需结果,可以使用以下内容:

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

Regex Demo

答案 4 :(得分:0)

大概有十二种方法可以做到。我会尝试

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