こんにちは、この正規表現を使用して、小数点区切り記号と千区切り記号を使用して数値を検証しました
ets = "\\,";
eds = "\\.";
"^([+\\-]?[0-9" + ets + "]*(" + eds + "[0-9]*)?)$"
しかし、これはfail
(受け入れるべきではない場合に受け入れます)私のユニットテストケースの2つに対して、
12.
、そして1,,2
、どなたか助けてください。
注: この作業は1..2
.
使用されている実際の正規表現を見てみましょう。
^([+\-]?[0-9\,]*(\.[0-9]*)?)$
12.
2 番目の部分が であるため、これは一致します(\.[0-9]*)
。*
はゼロ以上を意味するため、数字はオプションであることに注意してください。
これも1,,2
、最初の文字クラスにコンマを含めたため一致します[0-9\,]
。したがって、実際には正規表現も一致,,,,,,,,
します。
これは正規表現なしで解決できますが、正規表現が必要な場合は、次のようなものが必要になるでしょう。
^[+-]?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?$
内訳:
^ # match start of string
[+-]? # matches optional + or - sign
[0-9]{1,3} # match one or more digits
(,[0-9]{3})* # match zero or more groups of comma plus three digits
(\. # match literal dot
[0-9]+ # match one or more digits
)? # makes the decimal portion optional
$ # match end of string
これを Java で使用するには、次のようにします。
ets = ","; // commas don't need to be escaped
eds = "\\."; // matches literal dot
regex = "^[+-]?[0-9]{1,3}(" + ets + "[0-9]{3})*(" + eds + "[0-9]+)?$"
私の理解が正しければ、12. が一致するのは、(ピリオド、次に 0 から 9 までの任意の数の 0 回以上の発生) の 0 回または 1 回の発生に一致しているためです。したがって、ピリオドがあり、その前に何もない場合があります。
1,,2 は、0 から 9 までの任意の文字またはコンマの 0 回以上の出現に一致するため、一致します。したがって、0,,,,,,,,,,,,,0 を持つことができます。
最後の 1 つを一致させたくない場合は、コンマの前 (1000 の区切り記号) に最大 3 つの数字しか使用できないことを確認してください。数字の。
[0-9]{0,3},
@NullUserException は、あなたの意図に合った完全な正規表現を提供しました