我正在寻找一个验证美元金额大于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]会照顾这个,但事实并非如此。有什么想法吗?
答案 0 :(得分: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')
答案 1 :(得分:0)
在这个答案的底部,我以人类可读的形式打印了你的正则表达式,纠正了一些明显的错误并删除了无关紧要性。它由三个顶级替代品组成,除了第二个需要一个前导减号外,它们都是相同的,第三个要求将数字括在括号中。由于两者都是匹配负数的方法,并且您希望匹配大于零的数字,我将忽略这些并专注于第一种选择。
正则表达式中与实际数字匹配的部分由四个备选项组成,如您所见,第三个和第四个备选项允许数字从小数点前的零开始,或者根本没有任何内容。如果你摆脱这些,你的正则表达式将只匹配至少一美元的价值。但它仍然不会与不到一美元的正值相匹配。假设你想要匹配那些,你需要添加另一个选择,如:
^\$?
(
[1-9]\d{0,2}(,\d{3})*(\.\d{2})?
|
[1-9]\d*(\.\d{2})?
|
0?\.(?!00)\d{2}
)$
这是正美元金额的完整正则表达式,美元符号和前导零是可选的。如果有小数点,则必须后跟两位数。在第三种选择中,否定前瞻(?!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}
)\)$