可能重复:
What's a C# regular expression that'll validate currency, float or integer?
如何使用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
修改
我忘了提及以下模式也有效:###,###,###.##
答案 0 :(得分:17)
完全基于您提供的标准,这就是我想出的。
/(?:^\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})?$)/
此外,regular-expressions.info是一个很好的资源。
答案 1 :(得分:8)
这适用于您的所有示例:
/^(?:\d+(?:,\d{3})*(?:\.\d{2})?|\d+(?:\.\d{3})*(?:,\d{2})?)$/
作为一个冗长的正则表达式(但不支持JavaScript):
^ # 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.
答案 2 :(得分:0)
除了(仅添加?)123.45案例外,它处理上述所有内容:
function foo (s) { return s.match(/^\d{1,3}(?:\.?\d{3})*(?:,\d\d)?$/) }
您需要处理多种分隔符格式吗?