Simpelt regulært udtryk for et decimaltal med en præcision på 2

Hvad er det regulære udtryk for et decimaltal med en præcision på 2?

Valide eksempler:

123.12
2
56754
92929292929292.12
0.21
3.1

Ugyldige eksempler:

12.1232
2.23332
e666.76

Decimalkommaet kan være valgfrit, og hele tal kan også medtages.

Løsning

Gyldige regex-tokens varierer alt efter implementering. En generisk form er:

[0-9]+(\.[0-9][0-9]?)?

Mere kompakt:

\d+(\.\d{1,2})?

Begge forudsætter, at begge har mindst ét ciffer før og ét efter decimaltallet.

Hvis du vil kræve, at hele strengen er et tal af denne form, skal du indpakke udtrykket i start- og sluttags som (i Perl's form):

^\d+(\.\d{1,2})?$

Hvis du vil matche tal uden et ledende ciffer før decimaltallet (.12) og hele tal med et efterfølgende punktum (12.), mens du udelukker input med et enkelt punktum (.), kan du prøve følgende:

^(\d+(\.\d{0,2})?|\.?\d{1,2})$

Tilføjet

Indpakket den brøkdel i ()? for at gøre den valgfri. Vær opmærksom på, at dette udelukker former som 12. Inklusive, som ville være mere som ^\d+\\..?\d{0,2}$$.

Tilføjet

Brug ^\d{1,6}(\.\d{1,2})?$ for at stoppe gentagelser og give en begrænsning til hele decimalværdien.

Kommentarer (17)
^[0-9]+(\.[0-9]{1,2})?$

Og da regulære udtryk er forfærdelige at læse og endnu mindre at forstå, er her det tilsvarende ordrige udtryk:

^                         # Start of string
 [0-9]+                   # Require one or more numbers
       (                  # Begin optional group
        \.                # Point must be escaped or it is treated as "any character"
          [0-9]{1,2}      # One or two numbers
                    )?    # End group--signify that it's optional with "?"
                      $   # End of string

Du kan erstatte [0-9] med \d i de fleste implementeringer af regulære udtryk (herunder PCRE, den mest almindelige). Jeg har ladet det stå som [0-9], da jeg synes det er lettere at læse.

Her er også det enkle Python-script, jeg brugte til at kontrollere det:

import re
deci_num_checker = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""")

valid = ["123.12", "2", "56754", "92929292929292.12", "0.21", "3.1"]
invalid = ["12.1232", "2.23332", "e666.76"]

assert len([deci_num_checker.match(x) != None for x in valid]) == len(valid)
assert [deci_num_checker.match(x) == None for x in invalid].count(False) == 0
Kommentarer (7)

Skal du ikke tage hensyn til "e" i "e666.76"?

Med

(e|0-9)\d*\d.\d{1,2)
Kommentarer (3)