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
2
demandé sur dreeves 2008-09-26 01:06:42

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*$/
4
répondu dreeves 2008-09-25 21:54:25

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]*)?)$/
4
répondu tye 2008-10-02 05:18:14

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).

2
répondu Peter Boughton 2008-09-25 21:35:59

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
2
répondu brian d foy 2008-12-07 00:17:01

selon la langue que vous codez dans cette fonctionnalité peut déjà exister.

0
répondu EBGreen 2008-09-25 21:09:22