この回答の最後に、あなたの正規表現を人間が読める形式で出力し、いくつかの明らかな間違いを修正し、無関係なものを削除しました。これは 3 つの最上位の選択肢で構成されており、2 番目の選択肢では先頭にマイナス記号が必要であり、3 番目の選択肢では数値が括弧で囲まれていることを除いてすべて同じです。どちらも負の数に一致する方法であり、ゼロより大きい数に一致させたいので、それらを無視して最初の選択肢に集中します。
実際の数値に一致する正規表現の部分は、4 つの選択肢で構成されています。ご覧のとおり、3 番目と 4 番目の選択肢では、数値を小数点の前に 0 だけで開始することも、まったくゼロから開始することもできます。それらを取り除くと、正規表現は少なくとも 1 ドルの値のみに一致します。ただし、1 ドル未満の正の値にはまだ一致しません。それらも一致させたいと仮定すると、次のように別の選択肢を追加する必要があります。
^\$?
(
[1-9]\d{0,2}(,\d{3})*(\.\d{2})?
|
[1-9]\d*(\.\d{2})?
|
0?\.(?!00)\d{2}
)$
これは正のドル金額の完全な正規表現であり、ドル記号と先行ゼロはオプションです。小数点がある場合は、その後に 2 桁の数字が続く必要があります。3 番目の選択肢では、否定的な先読みにより、 orのような小数値は許可されますが、 orに(?!00)
一致することはありません。0.00
.00
0.01
.99
COMMENTS
またはモードを指定して上記のように正規表現を使用するかVERBOSE
(または、フレーバーがそれを呼び出すものは何でも。それらはすべて異なる名前を持っています)、またはすべての空白を削除できます。
^\$?([1-9]\d{0,2}(,\d{3})*(\.\d{2})?|[1-9]\d*(\.\d{2})?|0?\.(?!00)\d{2})$
以下は元の正規表現です。
^\$?
(
[1-9]\d{0,2}(,\d{3})*(\.\d{0,2})?
|
[1-9]\d*(\.\d{0,2})?
|
0(\.\d{0,2})?
|
\.\d{1,2}
)$
|
^-\$?
(
[1-9]\d{0,2}(,\d{3})*(\.\d{0,2})?
|
[1-9]\d*(\.\d{0,2})?
|
0(\.\d{0,2})?
|
\.\d{1,2}
)$
|
^\(\$?
(
[1-9]\d{0,2}(,\d{3})*(\.\d{0,2})?
|
[1-9]\d*(\.\d{0,2})?
|
0(\.\d{0,2})?
|
\.\d{1,2}
)\)$