在这个答案的底部,我以人类可读的形式打印了你的正则表达式,纠正了一些明显的错误并删除了不相关的内容。它由三个顶级选项组成,除了第二个需要前导减号,第三个希望数字括在括号中之外,它们都是相同的。由于两者都是匹配负数的方法,并且您希望匹配大于零的数字,因此我将忽略这些并专注于第一种选择。
与实际数字匹配的正则表达式部分由四个选项组成,如您所见,第三和第四个选项允许数字在小数点前仅以零开头,或者根本不以零开头。如果你去掉这些,你的正则表达式将只匹配至少一美元的值。但它仍然无法匹配不到一美元的正值。假设您也想匹配这些,您需要添加另一个替代方案,如下所示:
^\$?
(
[1-9]\d{0,2}(,\d{3})*(\.\d{2})?
|
[1-9]\d*(\.\d{2})?
|
0?\.(?!00)\d{2}
)$
这是一个正的美元金额的完整正则表达式,美元符号和前导零是可选的。如果有小数点,后面必须跟两位数。在第三种选择中,负前瞻(?!00)
阻止它匹配0.00
or .00
,同时仍然允许像0.01
or的小数值.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}
)\)$