加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

自定义数值范围和小数点的金额的正则表达式验证

发布时间:2020-12-14 00:37:13 所属栏目:百科 来源:网络整理
导读:金额格式正则表达式的结果在第三点,可点击目录查看,有兴趣可以看写的过程和分析,自定义金额格式在第二点。 下面这段代码来自网络上比较流行的正则表达式金额验证,由于很少自己写正则表达式,所以当提出需要限制最大金额的时候,我对这个表达式进行了一点

金额格式正则表达式的结果在第三点,可点击目录查看,有兴趣可以看写的过程和分析,自定义金额格式在第二点。

下面这段代码来自网络上比较流行的正则表达式金额验证,由于很少自己写正则表达式,所以当提出需要限制最大金额的时候,我对这个表达式进行了一点改动,顺便做个笔记。

var reg = /(^[1-9]([0-9]+)?(.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9].[0-9]([0-9])?$)/;
var money = "520.100";
//000 错
//0 对
//0. 错
//0.0 对
//050 错
//00050.12错
//70.1 对
//70.11 对
//70.111错
//500 正确
if (reg.test(money)) {
  alert("正确~");
}else{
  alert("有误~");
};

1.解读表达式

首先我们分析下这个表达式,即使没有正则表达式的基础也很好看懂。
该表达式的第一层有三个 “|” ,表示他允许有三种表达式。分别是:

  • (^1-9?(.[0-9]{1,2})?$)

    ^与$,基础知识,非新手略过

    ^ 表示匹配字符串的开始,$表示匹配字符串的结束,这两个符号的意义在于整个字符串的格式必须完全满足于该正则表达式,如果不加 ^或$ ,那诸如:bd12,12bd等等表达式可能都会判断为正确的金额格式,因为没有限制开始和结束,正则表达式只需要验证的目标存在需要的格式都算正确。

    书归正传

    • [1-9] 表示从1-9取一位数字
    • ([0-9]+)? 表示从0-9取一位数字,+重复一次或更多次,也就是表示0到无穷大,后面再加了一个”?”,重复零次或一次,也即是,这个表达式可能是什么结果都没有。那把这个表达式和前面的[1-9]结合就是 (^[1-9]([0-9]+)? 正整数到无穷大。
    • (.[0-9]{1,2})?$ 表示”.”+ (0到9之间的数字)*(1到两个),外层再套了一个括号+? ,表示或许没有或一次。
  • (^(0){1}$) 这个表达式的数字范围只有一个,0.

  • (^[0-9].[0-9]([0-9])?$) :[0到9之间的数字]+“.”+[0-9之间的数字]*{0或者1个}

整个表达式理解起来没什么难度,但加入要添加点内容该如何写呢?我现在需要控制最大值为千万,即最大为9999999.99

表达式只需要改一部分

var reg = /(^[1-9]([0-9]{0,7})(.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9].[0-9]([0-9])?$

([0-9]+)? 改为了 ([0-9]{0,7})

以上应该没什么不好理解的吧。我主要想分析下以上的表达式能否进一步优化,是否还有缩减的空间。

2.自己写表达式和优化

那我们首先要明白我们的需求——金额格式。我们不防列下所有的常规的合法金额格式。

金额由三部分组成:

整数部分(A) 、 小数点(B) 、 小数部分(C)

我们将此三部分简化为A/B/C,方便下面罗列

有效金额的组合方式为

  1. A
  2. A + B + C

结论:
1. A可以独立存在,也可以和其他部分一起存在,也即是A不需要依赖BC,只要他是整数就OK。
2. B和C必须同时依附于A存在

既然只有两种情况那似乎很好写了,我们先写A,A的表达式基本可以分为两种情况,
1. 第一位为0
2. 第一位不为0

这两种是一定要区分开的,因为为0后面就不能接其他数字,那必然要分两种情况

^([1-9]([0-9]{0,n})|[0])$    --n表示整数最大位数-1,n大于0

整数部分写好了,我们再写小数部分,BC一起存在,可有可无

注意:单独验证这一部分的时候是没有整数的,即合法值为小数点开头

^(/.[0-9]{1,m})?$          --m表示最大位数-1,m大于0

将两部分结合的时候要注意一点,开始和结束的符号,还有小数部分的必要性,所以小数整个部分肯定要加个?

上下结合结果如下(n、m可根据实际需求填写。)

^([1-9]([0-9]{0,n})|([0]))(.[0-9]{1,m})?$

例如:整数部分最大8位,2位小数,n=8-1,m=2

^([1-9]([0-9]{0,7})|([0]))(.[0-9]{1,2})?$

3.结果对比

怎么样,比之

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

是否要精简一些?当然,无论哪一种都是合理的,只是个人感觉表达式太长改动起来就会费力些,而且多个表达式如果其结果范围有交集,那么我们就有优化的空间。

最终推荐:

^([1-9]([0-9]{0,2})?$

若使用的过程中发现错误,请指正,在此感谢!笔者正则表达式也非常之菜,此篇文章只是兴趣使然又去看了下语法的产物,又去。。语法不好记。

4.demo下载

下载链接: http://download.csdn.net/detail/wang124454731/9853136

有许多写的过程中的表达式我没有删掉,仅注释掉了,可见写个金额正则表达式并不难,有兴趣可以自己练练手。

自定义整数位数、小数点位数可见下篇 http://www.52php.cn/article/p-qtshxgki-bpr.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读