第一个答案:
这匹配#,###,##0.00:
^[+-]?[0-9]{1,3}(?:\,?[0-9]{3})*(?:\.[0-9]{2})?$
这匹配#.###.##0,00:
^[+-]?[0-9]{1,3}(?:\.?[0-9]{3})*(?:\,[0-9]{2})?$
加入两者(有更聪明/更短的编写方法,但它有效):
(?:^[+-]?[0-9]{1,3}(?:\,?[0-9]{3})*(?:\.[0-9]{2})?$)
|(?:^[+-]?[0-9]{1,3}(?:\.?[0-9]{3})*(?:\,[0-9]{2})?$)
您还可以将捕获组添加到最后一个逗号(或点)以检查使用了哪个。
第二个答案:
正如 Alan M 所指出的,我之前的解决方案可能无法拒绝像 11,111111.00 这样的值,其中缺少逗号,但另一个没有。经过一些测试,我达到了以下避免此问题的正则表达式:
^[+-]?[0-9]{1,3}
(?:(?<comma>\,?)[0-9]{3})?
(?:\k<comma>[0-9]{3})*
(?:\.[0-9]{2})?$
这值得解释一下:
^[+-]?[0-9]{1,3} 匹配前(1 到 3)位数字;
(?:(?<comma>\,?)[0-9]{3})? 匹配可选逗号后跟更多 3 位数字,并将逗号(或不存在的一个)捕获到名为“逗号”的组中;
(?:\k<comma>[0-9]{3})* 匹配前面使用的逗号(如果有)后跟 3 位数字的零到任何重复;
(?:\.[0-9]{2})?$ 匹配字符串末尾的可选“cents”。
当然,这只会涵盖#,###,##0.00(而不是#.###.##0,00),但您可以随时加入正则表达式,就像我在上面所做的那样。
最终答案:
现在,一个完整的解决方案。缩进和换行只是为了便于阅读。
^[+-]?[0-9]{1,3}
(?:
(?:\,[0-9]{3})*
(?:.[0-9]{2})?
|
(?:\.[0-9]{3})*
(?:\,[0-9]{2})?
|
[0-9]*
(?:[\.\,][0-9]{2})?
)$
这个变体捕捉了使用的分隔符:
^[+-]?[0-9]{1,3}
(?:
(?:(?<thousand>\,)[0-9]{3})*
(?:(?<decimal>\.)[0-9]{2})?
|
(?:(?<thousand>\.)[0-9]{3})*
(?:(?<decimal>\,)[0-9]{2})?
|
[0-9]*
(?:(?<decimal>[\.\,])[0-9]{2})?
)$
编辑 1:“美分”现在是可选的;
编辑2:添加文字;
edit 3:添加第二个解决方案;
edit 4:添加了完整的解决方案;
edit 5:添加了标题;
edit 6:添加捕获;
编辑 7:最后一个答案分为两个版本;