精度が2の10進数の単純な正規表現

精度が2の10進数を表す正規表現は何ですか?

有効な例です。

123.12
2
56754
92929292929292.12
0.21
3.1

無効な例:

12.1232
2.23332
e666.76

小数点は省略可能で、整数が含まれる場合もあります。

ソリューション

有効な正規表現のトークンは、実装によって異なります。一般的な形としては

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

よりコンパクトです。

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

どちらも小数点以下の桁が前後に1つ以上あることが前提です。

文字列全体がこの形式の数値であることを要求するには、次のように式を開始タグと終了タグで囲みます(Perl'の形式)。

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

小数点以下の先頭に桁がない数字(.12)と,末尾にピリオドがある整数(12.)にマッチさせつつ,ピリオド1つ(.)の入力を除外するには,次のようにします。

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

追加

小数部分を ()? で囲み、省略可能にしました。 ただし、12.のような形は除外されています。

Added

繰り返しを止めて、10進数の整数部分に制限を与えるために、^\d{1,6}(\.d{1,2})?$を使用します。

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

また、正規表現は読むのも理解するのも大変なので、ここでは冗長な表現にしています。

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

ほとんどの正規表現の実装(最も一般的なPCREを含む)では [0-9]\d と置き換えることができます。私は[0-9]のままにしていますが、その方が読みやすいと思うからです。

また、チェックに使った簡単なPythonスクリプトは以下の通りです。

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
解説 (7)

e666.76 "の "e "を考慮する必要があるのではないですか?

また

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