What's the shortest regex that can match non-zero floating point numbers with any number of decimal places?
Question
What's the shortest regex that can match non-zero floating point numbers with any number of decimal places?
It should accept numbers like
-1
-5.9652
-7.00002
-0.8
-0.0500
-0.58000
0.01
0.000005
0.9900
5
7.5
7.005
but reject constructions such as
.
.02
-.
-.996
0
-0
0.
-0.
-0.000
0.00
--
..
+
+0
+1
+.
+1.26
,etc
I do not need support for the scientific notation, with e , E and such.
The language I'm using is C#, by the way.
Solution
^-?(0\.\d*[1-9]|[1-9]\d*(\.\d+)?)$
EDIT Updated to reflect new requirements (last decimals can be zero)
^-?(0\.\d*[1-9]\d*|[1-9]\d*(\.\d+)?)$
(Shorter than using lookahead: ^-?(0\.(?=[1-9])\d*|[1-9]\d*(\.\d+)?)$
.)
EDIT2 If e.g. 001.000
can pass
^-?(?=.*[1-9])\d+(\.\d+)?$
OTHER TIPS
This is the one I always use:
(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?
Utilized in a PHP example:
<?php
$s= '1.234e4';
preg_match('~(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?~', $s, $m);
print_r($m);
?>
Output:
Array
(
[0] => 1.234e4
[1] =>
[2] => 1.234
[3] => e4
)
-?(?!0)\d+(\.\d+)?
Note: Remember to put ^ $ if it's not done by your regexp matcher.
May I ask why the "shortest"? A pre-compiler RegExp or the same with non-matching groups could be faster. Also a test for zero could possibly be faster too.
You might wish to consider these variations.