Expression régulière pour tester si une chaîne se compose d'un réel valide nombre en base 10
exemples:
"1" yes
"-1" yes
"- 3" no
"1.2" yes
"1.2.3" no
"7e4" no (though in some cases you may want to allow scientific notation)
".123" yes
"123." yes
"." no
"-.5" yes
"007" yes
"00" yes
5 réponses
cela permet en option " + " et " - " devant. Et permet de tracer ou de commencer l'espace blanc.
/^\s*[+-]?(?:\d+\.?\d*|\d*\.\d+)\s*$/
il y a plusieurs alternatives. Tout d'abord, l'utilisation d'une assertion d'anticipation de largeur zéro vous permet de rendre le reste de la regex plus simple:
/^[-+]?(?=\.?\d)\d*(?:\.\d*)?$/
si vous voulez éviter le look-ahead, alors j'essaierais de décourager le regex de back-tracking:
/^[-+]?(?:\.\d+|\d+(?:\.\d*)?)$/
/^[-+]?(\.\d+|\d+(\.\d*)?)$/ # if you don't mind capturing parens
notez que vous avez dit "base 10" de sorte que vous pourriez réellement vouloir rejeter des zéros de tête supplémentaires puisque "014" pourrait être censé être octal:
/^[-+]?(?:\.\d+|(?:0|[1-9]\d*)(?:\.\d*)?)$/
/^[-+]?(\.\d+|(0|[1-9]\d*)(\.\d*)?)$/
Enfin, vous pourriez vouloir remplacer \d
par [0-9]
puisque certains regexes ne supportent pas \d
ou parce que certains regexes permettent \d
pour correspondre à Unicode "chiffres" autre que 0..9 comme L'art.
/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/
/^[-+]?(\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)$/
correspond à tous les exemples spécifiés, ne capture aucun groupe:
^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$
Une non-correspondance "1."(etc):
^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$
ne se soucie pas de l'espace (utilisez une fonction de finition).
l'expression régulière dans perlfaq4: Comment déterminer si un scalaire est un nombre/entier/flottant? fait ce que vous voulez, et il gère la notation "e" aussi.
while( <DATA> ) { chomp; print /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/ ? "$_ Works\n" : "$_ Fails\n" ; } __DATA__ 1 -1 - 3 1.2 1.2.3 7e4 .123 123. . -.5
selon la langue que vous codez dans cette fonctionnalité peut déjà exister.