精度が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.
のような形は除外されています。
繰り返しを止めて、10進数の整数部分に制限を与えるために、^\d{1,6}(\.d{1,2})?$
を使用します。
^[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
e666.76 "の "e "を考慮する必要があるのではないですか?
また
(e|0-9)\d*\d.\d{1,2)