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

在 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 回答
2

在这个答案的底部,我以人类可读的形式打印了你的正则表达式,纠正了一些明显的错误并删除了不相关的内容。它由三个顶级选项组成,除了第二个需要前导减号,第三个希望数字括在括号中之外,它们都是相同的。由于两者都是匹配负数的方法,并且您希望匹配大于零的数字,因此我将忽略这些并专注于第一种选择。

与实际数字匹配的正则表达式部分由四个选项组成,如您所见,第三和第四个选项允许数字在小数点前仅以零开头,或者根本不以零开头。如果你去掉这些,你的正则表达式将只匹配至少一美元的值。但它仍然无法匹配不到一美元的正值。假设您也想匹配这些,您需要添加另一个替代方案,如下所示:

^\$?
(
  [1-9]\d{0,2}(,\d{3})*(\.\d{2})?
  |
  [1-9]\d*(\.\d{2})?
  |
  0?\.(?!00)\d{2}
)$

这是一个正的美元金额的完整正则表达式,美元符号和前导零是可选的。如果有小数点,后面必须跟两位数。在第三种选择中,负前瞻(?!00)阻止它匹配0.00or .00,同时仍然允许像0.01or的小数值.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 回答