Enostaven regularni izraz za decimalno število z natančnostjo 2

Kakšen je regularni izraz za decimalno število z natančnostjo 2?

veljavni primeri:

123.12
2
56754
92929292929292.12
0.21
3.1

Neveljavni primeri:

12.1232
2.23332
e666.76

Decimalna vejica je lahko neobvezna, vključena pa so lahko tudi cela števila.

Rešitev

Veljavni žetoni regex se razlikujejo glede na implementacijo. Splošna oblika je:

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

Bolj kompaktno:

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

Pri obeh se predpostavlja, da imata obe števili vsaj eno številko pred in eno za decimalnim mestom.

Če želite zahtevati, da je celoten niz število te oblike, izraz ovijte z začetno in končno oznako, kot na primer (v Perlovi obliki):

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

Če želite ujemati števila brez začetne številke pred decimalko (.12) in cela števila z zaključno piko (12.), hkrati pa izključiti vnos ene same pike (.), poskusite z naslednjim:

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

Dodano

Delni del je zavit v ()?, da je neobvezen. Zavedajte se, da to izključuje oblike, kot je 12. Vključno z `^\d+\..?\d{0,2}$``.

Dodano

Uporabite ^\d{1,6}(\.\d{1,2})?$ za prekinitev ponavljanja in omejitev na celoten del decimalne vrednosti.

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

Ker je regularne izraze grozno brati, še manj pa razumeti, je tu še besedni ekvivalent:

^                         # 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

V večini implementacij regularnih izrazov (vključno z najpogostejšo PCRE) lahko [0-9] nadomestite z \d. Sam sem pustil [0-9], saj menim, da je tako lažje berljivo.

Tukaj je tudi preprosta skripta Python, ki sem jo uporabil za preverjanje:

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
Komentarji (7)

Ali ne boste morali upoštevati e v e666.76?

S

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