2012-06-13 16 views
18

Hallo ich möchte eine Zahl, die kleiner oder gleich 100 ist, es kann alles innerhalb 0-100 sein, aber die Regex sollte nicht für eine Zahl übereinstimmen, die größer als 100 ist wie 120 130,150,999, etc ..Wie passt man eine Zahl an, die kleiner oder gleich 100 ist?

+2

Wie wäre es '0.5' oder' 1e2'? Sollten diese zusammenpassen? Was ist mit '0000001'? –

+6

Warum möchten Sie eine Regex dafür verwenden? Perl verfügt bereits über perfekt zu bedienende Boolesche Vergleichsoperatoren (<, <=, ==, >,> =). –

+1

Wie Dave sagt, willst du wirklich einen regulären Ausdruck? Perl behandelt eine Variable als String oder als Zahl, und Sie können 'if ($ num> = 0 und $ num <= 100) {...}' – Borodin

Antwort

0

regex für dieses

perl -le 'for (qw/0 1 19 32.4 100 77 138 342.1/) { print "$_ is ", /^(?:100|\d\d?)$/ ? "valid input" : "invalid input"}' 
6

Wie wäre dies für die regex:

^([0-9]|[1-9][0-9]|100)$ 

auf 7, 82, 100 für Beispiele bestätigen würde, würde aber nicht validieren 07 oder 082.

Check this out für weitere Informationen (und Variationen einschließlich Null Vorfixierung) auf Nummernbereich Überprüfung


Wenn Sie Gleitkommazahlen gerecht zu werden benötigen, sollten Sie read this, hier ist ein Ausdruck, den Sie verwenden können:

Gleitpunkt: ^[-+]?([0-9]|[1-9][0-9]|100)*\.?[0-9]+$

36

Versuchen Sie, diese

\b(0*(?:[1-9][0-9]?|100))\b 

Erklärung

" 
\b    # Assert position at a word boundary 
(    # Match the regular expression below and capture its match into backreference number 1 
    0    # Match the character “0” literally 
     *   # Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
    (?:   # Match the regular expression below 
        # Match either the regular expression below (attempting the next alternative only if this one fails) 
     [1-9] # Match a single character in the range between “1” and “9” 
     [0-9] # Match a single character in the range between “0” and “9” 
      ?  # Between zero and one times, as many times as possible, giving back as needed (greedy) 
     |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     100  # Match the characters “100” literally 
    ) 
) 
\b    # Assert position at a word boundary 
" 

Besuchen here für zukünftige Probleme.

+5

+1 für die Erklärung – Dave

+4

der von Ihnen angegebene Link ist durch eingeschränkt Benutzername und Passwort anfordern! – goseo

+0

Fantastisch! Danke für die Erklärung. –

3

Verwenden -Code Assertions, wenn Sie einen regulären Ausdruck benötigen (schließlich):

/^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/ 

Test:

my @nums = (-1, 0, 10, 22, 1e10, 1e-10, 99, 101, 1.001e2); 

print join ',', grep 
       /^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/, 
       @nums 

Ergebnis:

0,10,22,1e-010,99 

(==>Here is sth. to learn about code assertions).

+0

versucht, den Link zu sehen, aber immer noch nicht verstehen, die Regexp. Denkst du, du kannst es erklären? (besonders der ---? '': '^' --- Teil – taiko

0

Diese Regex passt die Zahlen 0-100 diapason und nicht zulassen Zahlen wie 001:

\b(0|[1-9][0-9]?|100)\b 
0

Meine praktische Tipps.

Persönlich würde ich eine solche komplexe Regex überhaupt nicht schreiben. Was ist, wenn sich Ihre Nummer in naher Zukunft von 100 auf 200 ändert? Ihre Regex muss sich erheblich ändern und es könnte noch schwieriger zu schreiben sein. Alle oben genannten Lösungen sind nicht selbsterklärend und Sie müssen es mit einem Kommentar in Ihrem Code ergänzen. Das ist ein Geruch.

Lesbarkeit ist wichtig. Code ist für Menschen und nicht für Maschinen.

Warum nicht etwas Code um es herum schreiben und Regex tot einfach zu verstehen halten.

0

diese Übereinstimmung mit 0 zu 100

^0*([0-9]|[1-8][0-9]|9[0-9]|100)$ 
Verwandte Themen