0

0 より大きい金額を検証する正規表現を探して^\$?([1-9]{1}[0-9]{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\-?\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))$|^\(\$?([1-9]{1}\d{0,2}(\,\d{3})*(\.\d{0,2})?|[1-9]{1}\d{0,}(\.\d{0,2})?|0(\.\d{0,2})?|(\.\d{1,2}))\)$います。

$1.00 1.00 1 $1.00 $1

0 0.00 $0 $0.00 も許可

私はしたくない。式の先頭に [1-9] を付ければ問題ないと思ったのですが、そうではありません。何か案は?

4

2 に答える 2

2

この回答の最後に、あなたの正規表現を人間が読める形式で出力し、いくつかの明らかな間違いを修正し、無関係なものを削除しました。これは 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.000.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}
)\)$
于 2013-10-16T02:18:56.063 に答える
2

Python 2.7 の場合 (sre.SRE_Match オブジェクトは、文字列が RE で見つかったことを示していることに注意してください)。

>>> cents = '0\.([1-9][0-9]|0[1-9])'
>>> dollars = '[1-9]+(\.[0-9][0-9])?'
>>> not_broke = re.compile('^\$?(' + dollars + '|' + cents + ')$')

>>> not_broke.match('$1.00')
<_sre.SRE_Match object at 0x10b3b1880>

>>> not_broke.match('1.00')
<_sre.SRE_Match object at 0x10b3b1918>  

>>> not_broke.match('1')
<_sre.SRE_Match object at 0x10b3b1880>

>>> not_broke.match('$1')
<_sre.SRE_Match object at 0x10b3b1918>

>>> not_broke.match('0.00')
>>> not_broke.match('0')
>>> not_broke.match('$0')
>>> not_broke.match('$0.00')
于 2013-10-15T18:20:29.687 に答える