最近我在学习正则表达式,写了匹配货币的:
☆有两种验证方法:
第一种货币中不带“,“
((^[-]?([1-9]\d*))|^0)(\.\d{1,2})?$|(^[-]0\.\d{1,2}$)
第二种货币中能带千分符(英式逗号)时必须带上
(^[-]?[1-9]\d{0,2}($|(\,\d{3})*($|(\.\d{1,2}$))))|((^[0](\.\d{1,2})?)|(^[-][0]\.\d{1,2}))$
------------------------------------以下是详细说明----------------------------------
------------------------------------第一种----------------------------------------------
第一种:货币中不带“,“
((^[-]?([1-9]\d*))|^0)(\.\d{1,2})?$|(^[-]0\.\d{1,2}$)
允许负数、若有小数点则精确小数点后两位
允许情况:0、-0.2、-0.22、0.5、0.55、7、-7、-67634534536456.3、-22456.56、78655
不允许情况:-0(负零)、包含-(负号).(小数点)和数字外的其他符号、0213.22、07等等 .........总之格式不对的都不行
分段逻辑:(蓝字部分是要说明部分)
((^[-]?([1-9]\d*))|^0)(\.\d{1,2})?$|(^[-]0\.\d{1,2}$):
(正负号可开头且后面必须是1-9的数字,数字后面可以跟零到多个数字)或(以零开头)
如:0、-7、-33、3333、-55653334都能通过验证
((^[-]?([1-9]\d*))|^0)(\.\d{1,2})?$|(^[-]0\.\d{1,2}$)
红色部分后面如果有小数点,那么必须以(小数点+1-2位数字)结尾!
((^[-]?([1-9]\d*))|^0)(\.\d{1,2})?$|(^[-]0\.\d{1,2}$)
如果这个数字以-0(负零)开头,那么必须以(小数点+1-2位数字)结尾!
-------------------------------第二种-------------------------------
第二种:货币中能带千分位分隔符(“,”英文逗号)时必须带上
(^[-]?[1-9]\d{0,2}($|(\,\d{3})*($|(\.\d{1,2}$))))|((^[0](\.\d{1,2})?)|(^[-][0]\.\d{1,2}))$
带千分位分隔符、允许负数、可精确到小数点1-2位
允许情况:0、-0.2、-0.22、5、3,324,234、3,234.32、等等正常的货币表示法
不允许情况:-0、-03、4562432、3,243.、等等违反规定的表示方法
分段逻辑:
上面是我精简的,还是上原始版的吧:
(^[-]?[1-9]((\d{0,2}$)|(\d{0,2}(\,\d{3})*$|((\d{0,2})(\,\d{3})*(\.\d{1,2}$)))))|(^[0](\.\d{1,2})?$)|(^[-][0]\.\d{1,2}$)
这个是原始版的,比较长,但是便于阅读。
总体介绍:
(^[-]?[1-9]((\d{0,2}$)|(\d{0,2}(\,\d{3})*$|((\d{0,2})(\,\d{3})*(\.\d{1,2}$)))))|(^[0](\.\d{1,2})?$)|(^[-][0]\.\d{1,2}$)
按上面三种颜色分为三种情况,中间用或运算符连接
第一段匹配所有正负号开头,后面跟1-9数字的情况
第二、三段匹配所有以零(0)或者负零(-0)开头的所有情况
第一段:
(^[-]?[1-9]((\d{0,2}$)|(\d{0,2}(\,\d{3})*$|((\d{0,2})(\,\d{3})*(\.\d{1,2}$)))))
以正负号开头且后面必须跟上1-9的数字(后面跟上0-2个0-9的数字并结尾)或(后面跟上0-2个的数字,(再跟上0到多个 逗号+三个数字并结尾))或(后面跟上0-2个的数字,再跟上0到多个 逗号+三个数字,再跟上 小数点+1-2个数字并结尾)。也就是说:
绿色部分匹配如(1、123、-231等不带逗号的整数);红色部分匹配如(234,234、1,234 、-1,123 、2,123,123,423等带逗号不带小数点的整数);蓝色部分匹配如(2.23 、1,231.23 、-1,231.3等带小数的情况)
第二段:
(^[0](\.\d{1,2})?$)
匹配必须以零开头,可以带小数的情况。如:0 、0.2 、0.22等
第三段:
(^[-][0]\.\d{1,2}$)
匹配必须以负零(-0)开头,并且后面有小数的情况。只匹配例如-0.2 、-0.22两种情况。
------------------------------------------------总结---------------------------------------------
1、千分符情况也比较特殊,因为千分符的存在,所以对小数点之前的数字讨论需要以千分符作为分隔,用以区分几种不同的情况(如9 、999 、99,222 、999,999,999.33)。
2、零这种情况比较特殊,因为负零(-0)不能单独存在,必须后面跟小数点和数字结尾,而且零有时还不能作为开头(如:099就不正确),所以要对零进行分情况讨论。
最后,谢谢阅读,欢迎交流讨论,有什么问题请批评指正。
祝 生活愉快!~