2016-12-15 54 views
1

正则表达式的尊敬神(http://xkcd.com/208/)负数,小数的正则表达式与格式化条件

请提供匹配十进制数高达4位小数(我已经包含低于可接受的例子),尽管有一对额外的模式条件(列在底部)。

可接受:

0 
0.1 
0.12 
0.123 
0.1234 
1 
1.1 
... 
123456789.1234 

(注:上面的最后一个例子是,表明有上数量如何能得到没有限制)

也是可以接受的是负数:

-0.1 
-0.12 
-0.123 
-0.1234 
-1 
-1.1 
... 
-123456789.1234 

(注意:小号负号码没有限制r可以得到)

但是,下面的数字是不可接受的,即:独立减/加号,负零,带有一个或多个前导零的数字,带有前导加号的数字和不完整小数,例如:

- 
+ 
-0 
.1234 
007 
+0.1 
+123456789.1234 
.1234 
1. 

谢谢:)

+6

神希望先看到你的企图,或者它会燃烧你的数字。 – Maroun

+0

@MarounMaroun等到Wiktor出现:P – rafid059

+2

Pro-tip不使用正则表达式,几乎在任何你使用的语言中都有一个更好的解决方案。 –

回答

3

这将做到这一点:^(-?0\.\d{1,4}|-?[1-9]\d*(\.\d{1,4})?|0)$。在这里,你可以玩:https://regex101.com/r/e7ch1G/3

+0

似乎并不接受编号0 –

+0

我编辑了我的答案。它现在匹配0。 –

0

这应该这样做

^(?:-|\+)?\d+?(?:\.\d{1,4})?$ 
+0

'+'是一个量词,除非被转义或在角色类中。 – chris85

+0

啊我错过了。谢谢! –

2

你可以使用这样的正则表达式,但是这将匹配少数的例子,你不想:

^-?\d+(?:.\d{1,4})?$ 

Working demo

但是,如果你想要一个更复杂的正则表达式来放弃你列出的所有模式,那么你可以使用报废的技术是这样的:

^-0$(*SKIP)(*FAIL)|^-?0\d+(?:\.\d+)?$(*SKIP)(*FAIL)|^-?\d+(?:.\d{1,4})?$ 

Working demo

这种正则表达式由PCRE引擎支持。所以,如果你不使用PCRE,您可以用捕获组达到同样的目标,所以捕捉组捕捉你想要的内容,例如:

^-0$|^-?0\d+(?:\.\d+)?$|^(-?\d+(?:.\d{1,4})?)$ 

Working demo

enter image description here