Quelle est la plus courte regex qui peut correspondre à des nombres à virgule flottante non nul avec un nombre de décimales?
Question
Quelle est la plus courte regex qui peut correspondre à des nombres à virgule flottante non nul avec un nombre de décimales?
Il faut accepter de tels chiffres
-1
-5.9652
-7.00002
-0.8
-0.0500
-0.58000
0.01
0.000005
0.9900
5
7.5
7.005
mais rejeter les constructions telles que
.
.02
-.
-.996
0
-0
0.
-0.
-0.000
0.00
--
..
+
+0
+1
+.
+1.26
,etc
Je ne ai pas besoin de soutien pour la notation scientifique, avec e, E et autres.
La langue que je utilise est C #, par la manière.
La solution
^-?(0\.\d*[1-9]|[1-9]\d*(\.\d+)?)$
EDIT Mise à jour pour refléter les nouvelles exigences (dernières décimales peuvent être zéro)
^-?(0\.\d*[1-9]\d*|[1-9]\d*(\.\d+)?)$
(plus court que l'aide de préanalyse. ^-?(0\.(?=[1-9])\d*|[1-9]\d*(\.\d+)?)$
)
EDIT2 Si par exemple 001.000
peut passer
^-?(?=.*[1-9])\d+(\.\d+)?$
Autres conseils
Ceci est celui que j'utilise toujours:
(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?
Dans un exemple Utilisé PHP:
<?php
$s= '1.234e4';
preg_match('~(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?~', $s, $m);
print_r($m);
?>
Sortie:
Array
(
[0] => 1.234e4
[1] =>
[2] => 1.234
[3] => e4
)
-?(?!0)\d+(\.\d+)?
Note: Rappelez-vous de mettre ^ $ si elle ne se fait pas par votre regexp matcher
.Puis-je demander pourquoi le « plus court »? Un RegExp pré-compilateur ou même avec des groupes qui ne correspondent pas pu être plus rapide. En outre un test pour zéro pourrait être plus rapide aussi.
Vous voudrez peut-être envisager ces variations .