给定的输入,如:
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*$