正则表达式-匹配千分位为分隔的金额

1,550 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

表单的输入校验,内容是以千分位为分隔的金额,必须保留两位小数,类型是字符串,在表单中判断用户输入的金额是否符合规定的格式。
举例:0.001.0212.01123.001,123.1112,123.22123,123.231,123,123.02等等都是允许。
但是除了不足1(如0.12)或者0.00的情况除外,不允许以0开头。

分析

这个金额的字符串除了符号之外,可以看成由三个部分组成,用字母表示为yyy,xxx,xxx,xxx.zz或者yyy.zz

  1. yyy代表字符串的开头,位于第一个逗号,之前,如果不存在逗号,,那就是位于.之前;因为除特殊情况外,不允许以0开头,所以诸如002012都是不允许,都应该写出2或者12;因此y不一定有三个,可能只有一个或者两个,但至少必须得有一个;第一个存在的y取值范围是1-9,后续如果有y存在,则取值范围在0-9,如果y只有一个的话,则第一个y的取值范围为0-9,这是第一部分;
  2. 第二部分是xxx,与第一部分yyy相比,xxx可以存在多个或者零个,但是xxx一旦存在,必须满足每个逗号,之后都必须存在三个x;而且每个xxx都处于逗号,之后,每个x的取值范围是0-9
  3. 第三部分是zz,位于.之后,必须存在,且固定为两位,取值范围是0~9

正则表达式

从分析来看,这个正则也可以分成三个部分,分别匹配上面分析的三个部分:

  1. 首先是第一部分的yyy,有两种情况,第一个y是否为零,因为需要分情况,所以可确定开头的匹配可能需要用到|;如果第一个y为零,则匹配个0;如果不为零,则匹配不以零开头的数字[1-9],并且后续可能有0-2y,则匹配[0-9]{0,2},所以开头的匹配的正则表单为:

/^(0|[1-9][0-9]{2})/

  1. 如果开头的y不为零,则说明第二部分可能存在,所以需要在匹配开头y不为零的正则表达式后面加上xxx的匹配;这个比较简单,因为每个xxx处于逗号之后,所以先确定一个,,每个x的取值范围为0-9,且为连续的三个,所以正则表达式为[0-9]{3};总的表达式为(,[0-9]{3}),将这个正则表达式加到匹配第一个y不为零开头的后面,如下:

/^(0|[1-9][0-9]{2}(,[0-9]{3}))/

  1. 最后就是第三部分zz,因为处于.之后,所以同样匹配一个.,有两位,且每个z的取值范围都是0-9,所以正则表达式为(\.[0-9]{2}); 因此,最后总的正则表达式为:

/^(0|[1-9]{1}[0-9]{0,2}(,[0-9]{3})*)(.[0-9]{2})$/