正则表达式-匹配货币

时间:2021-11-09 07:39:08

最近我在学习正则表达式,写了匹配货币的:

☆有两种验证方法:

第一种货币中不带“,“

((^[-]?([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就不正确),所以要对零进行分情况讨论。


最后,谢谢阅读,欢迎交流讨论,有什么问题请批评指正。

祝 生活愉快!~