2011-05-26 13 views
2

它應該匹配0.1,1,01,但不是01,00.1,或者帶有字符的任何東西。需要一個正則表達式來匹配十進制數字而不是前導0

我想確定一個值是否應該被引用並在放入mysql插入語句之前轉義。我必須注意一些可能帶有前導0的數字的varchar鍵,如果作爲數字插入,它們將被截斷。

我也會使用內置的php或mysql函數(如果可用)。

編輯:這一個似乎涵蓋我所有的基地:

/^([1-9][0-9]*(\.[0-9]+)?|0\.[0-9]+|\.[0-9]+|0)$/ 
+3

您是否嘗試過使用正則表達式? – AntonioCS 2011-05-26 16:46:10

回答

1

試試這個:

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

here

或者

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

,如果他們出現在每一個單行。請參閱here

+0

第二個爲我工作。謝謝。 – 2011-05-26 17:23:45

2

試試這個正則表達式:

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

不符合'.01';需要更復雜的正則表達式;可能:'^(([1-9] \ d *)?\。\ d + | [1-9] \ d * | 0 \。\ d +)$' – 2011-05-26 16:51:23

+0

這應該由編輯的版本 – Keith 2011-05-26 16:58:15

+0

這仍然匹配01和00.1中的1和0.1 – morja 2011-05-26 17:18:07

1

這將滿足您的例子:

preg_match('#^(?=[1-9]|0\.|\.\d)\d*(\.\d+)?$#', $num) 

?=斷言保證它要麼從1-90.開始,所以任何其他前導零不包括在內。您可能想限制\d+可以匹配的decmal數量。

+0

這一個不匹配0. – 2011-05-26 17:23:11

相關問題