¿Cuál es la expresión regular más corto que puede coincidir distinto de cero números de punto flotante con cualquier número de decimales?
Pregunta
¿Qué es la expresión regular más corto que puede coincidir distinto de cero números de punto flotante con cualquier número de decimales?
Debe aceptar los números como
-1
-5.9652
-7.00002
-0.8
-0.0500
-0.58000
0.01
0.000005
0.9900
5
7.5
7.005
pero rechazar construcciones tales como
.
.02
-.
-.996
0
-0
0.
-0.
-0.000
0.00
--
..
+
+0
+1
+.
+1.26
,etc
No necesito apoyo a la notación científica, con e, E y tal.
El lenguaje que estoy usando es C #, por cierto.
Solución
^-?(0\.\d*[1-9]|[1-9]\d*(\.\d+)?)$
Editar Se ha actualizado para reflejar los nuevos requisitos (últimos decimales pueden ser cero)
^-?(0\.\d*[1-9]\d*|[1-9]\d*(\.\d+)?)$
(más corto que el uso de búsqueda hacia delante:. ^-?(0\.(?=[1-9])\d*|[1-9]\d*(\.\d+)?)$
)
Edit2 Si, por ejemplo, 001.000
puede pasar
^-?(?=.*[1-9])\d+(\.\d+)?$
Otros consejos
Este es el que siempre uso:
(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?
utilizado en un ejemplo PHP:
<?php
$s= '1.234e4';
preg_match('~(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?~', $s, $m);
print_r($m);
?>
Salida:
Array
(
[0] => 1.234e4
[1] =>
[2] => 1.234
[3] => e4
)
-?(?!0)\d+(\.\d+)?
Nota: Recuerde poner ^ $, si no se hace por su coincidencias de expresión regular
.¿Puedo preguntar por qué el "corto"? A RegExp pre-compilador o el mismo con grupos no coincidentes podrían ser más rápido. También una prueba de cero podría ser más rápido.