Einfacher regulärer Ausdruck für eine Dezimalzahl mit einer Genauigkeit von 2

Wie lautet der reguläre Ausdruck für eine Dezimalzahl mit einer Genauigkeit von 2?

Gültige Beispiele:

123.12
2
56754
92929292929292.12
0.21
3.1

Ungültige Beispiele:

12.1232
2.23332
e666.76

Das Dezimalkomma kann optional sein, und es können auch ganze Zahlen enthalten sein.

Lösung

Gültige Regex-Token variieren je nach Implementierung. Eine generische Form ist:

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

Kompakter:

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

Bei beiden wird davon ausgegangen, dass sie mindestens eine Vor- und eine Nachkommastelle haben.

Um zu verlangen, dass die gesamte Zeichenkette eine Zahl dieser Form ist, umschließen Sie den Ausdruck mit Start- und End-Tags wie (in Perl's Form):

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

Um Zahlen ohne eine führende Ziffer vor dem Komma (.12) und ganze Zahlen mit einem nachgestellten Punkt (12.) zu finden, während die Eingabe eines einzelnen Punktes (.) ausgeschlossen wird, versuchen Sie Folgendes:

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

Hinzugefügt

Der gebrochene Teil wurde in ()? eingeschlossen, um ihn optional zu machen. Seien Sie sich bewusst, dass dies Formen wie 12. ausschließt, was eher wie ^\d+\\.?\d{0,2}$ wäre.

Hinzugefügt

Verwenden Sie ^\d{1,6}(\.\d{1,2})?$, um die Wiederholung zu stoppen und eine Beschränkung auf den ganzen Teil des Dezimalwertes zu geben.

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

Und da reguläre Ausdrücke furchtbar zu lesen, geschweige denn zu verstehen sind, hier die ausführliche Entsprechung:

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

In den meisten Implementierungen regulärer Ausdrücke (einschließlich PCRE, der gängigsten) kann man [0-9] durch \d ersetzen. Ich habe es bei [0-9] belassen, da ich denke, dass es einfacher zu lesen ist.

Hier ist auch das einfache Python-Skript, mit dem ich das überprüft habe:

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

Müssen Sie nicht das "e" in "e666.76" berücksichtigen?

Mit

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