2016-12-15 32 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