¿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?

StackOverflow https://stackoverflow.com/questions/1831419

  •  11-09-2019
  •  | 
  •  

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.

¿Fue útil?

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.

Es posible que desee tener en cuenta estas variaciones .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top