给出如下输入:
123000
-123000
1.230000000
123.4000000
-123.4000000
123.0
是否有一个正则表达式将匹配非尾随的零部分,从而相应地给出如下捕获结果:
123000
-123000
1.23
123.4
-123.4
123.0
答案 0 :(得分:1)
对于您的示例数据,您可以匹配一个或多个数字,点后跟零或多个零的数字\d+\.[0-9]*
,这是贪婪的,并且匹配到行的末尾,然后匹配数字{{1 },以确保不匹配123.0之类的值。
然后使用[1-9]
重设所报告比赛的起点。消耗的所有物品不再是比赛的一部分。然后使用\K
匹配要删除的可能零,并用空字符串替换。
答案 1 :(得分:1)
可能的候选人是
(?!00+)([+-]?\d+(\.\d?)?)(0*[1-9])*
您可以在此demo中进行测试。
第一组为负前瞻,可防止选择仅由两个或多个零组成的匹配字符串(00000
,否则将匹配尾随字符串)
第二组匹配一个可选的符号,后跟一个或多个数字,后跟一个文字点和一个可选的数字(在示例中,小数点后的第一个数字可以为零),然后跟集合[1-9]
中的一组0个或多个数字组,并用一组零分隔(这保证该数字以一个非零数字结尾)
最后,您需要获得第二组,该组界定了您感兴趣的子字符串。有关详细信息,请参见demo。
将否定的前瞻强制在左侧的非单词边界处,它不匹配链的最终零,因为新的数字(连续的数字必须是不同的单词)导致出现以下新的正则表达式:>
(?!\B00+)([+-]?\d+(\.\d?)?)(0*[1-9])*
中可以看到
答案 2 :(得分:0)
一种解决方案是:^(-?\d+(?:\.\d+?[1-9]*)?)0*$
(
捕获组
-?
可选-\d+
一个或多个数字(?:
非捕获组
\.\d+?
。后跟一个或多个数字(非贪婪)[1-9]*
零个或多个非零数字)?
(可选)匹配组)
0*
零个或多个零点答案 3 :(得分:0)
您可以使用以下简单的正则表达式:
(\.[^0]+)0+
and replace with \1
注意:这将匹配小数点后的所有0
,而不是小数点后的所有
编辑:如果要在捕获组1中获得所需结果,可以使用以下内容:
([^.\s]+(?:\.[^0]+)?)0*
答案 4 :(得分:0)
大概有十二种方法可以做到。我会尝试
-?(\d+(?:\.[1-9]\d*?)?)0*$