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

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

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.jb51.cc/article/p-qtshxgki-bpr.html

自定义数值范围和小数点的金额的正则表达式验证的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  4. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  5. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  6. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  7. Swift截取HTML中的所有图片url

    在Swift中,要从HTML格式的String中截取出所有的img的所有图片url,要截取的url就要匹配url,需要用到正则表达式。

  8. 收藏swift正则表达式的各种验证

    1.验证邮箱classfuncvalidateEmail(email:String)->Bool{varemailString="[A-Z0-9a-z._%-]@[A-Za-z0-9.-]\\.[A-Za-z]{2,4}"varemailPredicate=nspredicate(format:"SELFMATCHES%@",emailString)returnemailPredicate.eva

  9. Swift3.0-正则表达式 <待续>

    贡献者:赵大财博客:https://my.oschina.net/zhaodacaiGitHub:https://github.com/zhaodacai邮箱:zhaodacai@yeah.comQQ:327532817=============================先直接来代码:NSRegularExpression.OptionscaseInsensitive不区分大小写allowC

  10. 1.1 Swift变量和常量,浮点数保留小数点后两位小数

    /*变量和常量c语言inta;*///一句话的结尾可以不要分号哦print("Helloworld")vara=10a=2print(a)letb=90print(b)//常量必须初始化赋值哦//letc=1;/*类型的标注这个变量x是整型*/varx:Intx=3print("%d=10",x);print(x);//类型非常安全,这个整型变量如果赋值10.4会报错的//x=10.4//如果我们

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部