如何使用JavaScript正则表达式验证货币金额?
小数分隔符: ,
十位、百位等分隔符: .
模式: ###.###.###,##
有效金额的示例:
1
1234
123456
1.234
123.456
1.234.567
1,23
12345,67
1234567,89
1.234,56
123.456,78
1.234.567,89
编辑
我忘记提到以下格式也是有效的:###,###,###.##
如何使用JavaScript正则表达式验证货币金额?
小数分隔符: ,
十位、百位等分隔符: .
模式: ###.###.###,##
有效金额的示例:
1
1234
123456
1.234
123.456
1.234.567
1,23
12345,67
1234567,89
1.234,56
123.456,78
1.234.567,89
编辑
我忘记提到以下格式也是有效的:###,###,###.##
根据您提供的标准,这是我得出的结果。
/(?:^\d{1,3}(?:\.?\d{3})*(?:,\d{2})?$)|(?:^\d{1,3}(?:,?\d{3})*(?:\.\d{2})?$)/
这很丑陋,而且随着您发现需要匹配的更多情况,它只会变得更糟。最好找到并使用一些验证库,而不是尝试自己完成所有操作,特别是不要在单个正则表达式中完成。
更新以反映添加的要求。
根据下面的评论再次更新。
它将匹配 123.123,123
(三个尾随数字而不是两个),因为它接受逗号或点作为千位分隔符和小数点。为了修复这个问题,我现在基本上将表达式加倍;要么它使用逗号作为分隔符和点作为基数点来匹配整个内容,要么它使用点作为分隔符和逗号作为基数点来匹配整个内容。
明白我说的越来越乱了吗?(^_^)
(?:^ # beginning of string
\d{1,3} # one, two, or three digits
(?:
\.? # optional separating period
\d{3} # followed by exactly three digits
)* # repeat this subpattern (.###) any number of times (including none at all)
(?:,\d{2})? # optionally followed by a decimal comma and exactly two digits
$) # End of string.
| # ...or...
(?:^ # beginning of string
\d{1,3} # one, two, or three digits
(?:
,? # optional separating comma
\d{3} # followed by exactly three digits
)* # repeat this subpattern (,###) any number of times (including none at all)
(?:\.\d{2})? # optionally followed by a decimal perioda and exactly two digits
$) # End of string.
有一件事情让它看起来更加复杂,那就是其中所有的?:
。通常正则表达式会捕获(返回匹配项)所有的子模式。而?:
的作用只是告诉它不要去捕获这个子模式。所以从技术上讲,如果你把所有的?:
都去掉,整个表达式仍然可以匹配你的整个字符串,这样看起来更清晰:
/(^\d{1,3}(\.?\d{3})*(,\d{2})?$)|(^\d{1,3}(,?\d{3})*(\.\d{2})?$)/
?:
。通常,正则表达式也会捕获(返回匹配项)所有子模式。所有 ?:
所做的就是说不要费力去捕获子模式。因此,从技术上讲,如果您将它们全部删除,它仍将匹配您的整个字符串,这看起来更清晰:/(^\d{1,3}(\.?\d{3})*(,\d{2})?$)|(^\d{1,3}(,?\d{3})*(\.\d{2})?$)/
- Wiseguy/^(?:\d+(?:,\d{3})*(?:\.\d{2})?|\d+(?:\.\d{3})*(?:,\d{2})?)$/
^ # Start of string
(?: # Match either...
\d+ # one or more digits
(?:,\d{3})* # optionally followed by comma-separated threes of digits
(?:\.\d{2})? # optionally followed by a decimal point and exactly two digits
| # ...or...
\d+ # one or more digits
(?:\.\d{3})* # optionally followed by point-separated threes of digits
(?:,\d{2})? # optionally followed by a decimal comma and exactly two digits
) # End of alternation
$ # End of string.
这处理了除(刚添加的?)123.45 案例之外的所有内容:
function foo (s) { return s.match(/^\d{1,3}(?:\.?\d{3})*(?:,\d\d)?$/) }