3

こんにちは、この正規表現を使用して、小数点区切り記号と千区切り記号を使用して数値を検証しました

ets = "\\,";
eds = "\\.";
"^([+\\-]?[0-9" + ets + "]*(" + eds + "[0-9]*)?)$"

しかし、これはfail(受け入れるべきではない場合に受け入れます)私のユニットテストケースの2つに対して、

12.、そして1,,2、どなたか助けてください。

注: この作業は1..2.

4

2 に答える 2

7

使用されている実際の正規表現を見てみましょう。

^([+\-]?[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]+)?$"
于 2013-10-28T17:29:32.583 に答える
1

私の理解が正しければ、12. が一致するのは、(ピリオド、次に 0 から 9 までの任意の数の 0 回以上の発生) の 0 回または 1 回の発生に一致しているためです。したがって、ピリオドがあり、その前に何もない場合があります。

1,,2 は、0 から 9 までの任意の文字またはコンマの 0 回以上の出現に一致するため、一致します。したがって、0,,,,,,,,,,,,,0 を持つことができます。

最後の 1 つを一致させたくない場合は、コンマの前 (1000 の区切り記号) に最大 3 つの数字しか使用できないことを確認してください。数字の。

[0-9]{0,3},

@NullUserException は、あなたの意図に合った完全な正規表現を提供しました

于 2013-10-28T17:36:20.190 に答える