Quelle est la plus courte regex qui peut correspondre à des nombres à virgule flottante non nul avec un nombre de décimales?

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

  •  11-09-2019
  •  | 
  •  

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.

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top