高级正则表达式实践

遇到一个奇葩需求,要求web端对对用户输入的金额进行正确性限定!
一个看似很简单却要求很多的一个需求,首先来整理整理要求

  1. 只能输入数字0到9以及英文符号
    2.第一个字符不能是.
    3.第一个字符不能输0
    4.最小金额是圆角分的分,而给点的单位是万元
    5.只能输入一个. (点)
    6.兼容到ie9

同事一看很简单
给出了一个的做法是


结果发现字符0,+,-,.
这些字符随便输入,没有限定
然后同事改变策略,监听oninput事件,在事件中判断并改变value值!但是代码有点冗长!

于是我打算使用正则表达式来处理这个问题!另一个目的是巩固一下正则的知识与使用!
使用的方法是在oninput或者onkeyup事件中使用replace替换掉不符合要求的字符!

 // RegEx为正则表达式
// 初步的RegEx 为:
 /([^0-9\.]+)|(^0+)|(^\.+)|((?<=\.\d{6,})(?![\w\W]*?\.\d{6,})[\w\W]*)|(?<=(?<=\.)[\w\W]*(?=\.))\./g

写完后后面一部分同事没看懂,希望讲解一下,所以才有了这边文章!

替换不合规字符

首先我们要知道replace是替换掉没有用的字符为‘’(空字符),
所以需要保留的是0-9以及.(点)


^[ ] 表示以[ ]中开头的字符,[^ ]表示除这些字符以外的字符,所以0-9以及.(点)以为的字符都被替换为空字符 /g表示全局搜索

不能以数字0开头

接下来是不以数字0开头,这个正则表达式比较简单 /^0+/g
结合上一步,我们使用分组


现在第一个字符就不能是0了,
聪明的你很定已经发现,要是0.0001这样的数字怎么办!(需求说不要,我们自己就不要自找麻烦了!然而需求阴晴不定,我们最好提前预知并实现。我相信聪明的你在看完这篇文章后会自己完善这个正则表达式)

不能以数字.开头

这个和上面的那个是一样的


小数位限定

这个小数位限定和普通匹配的时候就不一样了,我要需要做的是获取小数点后面的数字并替换掉他们。
所以难度系数高很多
为了解决这问题,我们使用的正则表达式的断言(零宽)
断言主要有以下4个用法:

(?<=exp)【正向后行断言】 匹配前面是exp的数据
(? (?=exp)【正向先行断言】 匹配后面是exp的数据
(?!exp) 【负向先行断言】匹配后面不是exp的数据

(?<=\.\d{6,}) // 找到.后面6位小数的位置 如果看不懂,限定一位小数点 中有更加详细的说明
(?![\w\W]*?\.\d{6,})[\w\W]*) // 找到小数点后6位的全部字符

限定一位小数点

同样需要使用断言,而且还需要使用嵌套断言,这里讲分步说明
首先获取.后面的字符,在找到.后面的中再次出现点的位置后面的字符里面匹配到.并把它替换

(?<=\.)  // 找到.后的位置,宽度 0, 断言点, 如果出现2个点,那么他又2个值,都为‘’
(?<=\.)[\w\W]* // 匹配点后面的所有字符,现在即使出现了多个. 也只是匹配出第一个点后面的所有字符
// 比如123.32132132. 匹配出 32132132.
// 但是我们匹配出来的是一个字符串,里面除了最后的. 其他都是有用的数据,所以我们要找匹配出这个点
(?<=\.)[\w\W]*(?=\.) // 利用正向先行断言从上面的值里面找到.之前的位置
// 匹配结果为32132132
// 而当前的匹配位置为32132132_. 既_(下滑线)位置,结果为‘’(空字符)!
(?<=(?<=\.)[\w\W]*(?=\.)) // 然后在这个位置正向后行断言
(?<=(?<=\.)[\w\W]*(?=\.))\. // 最后从该出向后取值. 得到结果. 并替换


最终完成需求

最后希望感兴趣的朋友尝试实现0.00001这样的输入, 答案我会评论去给出,希望大家在不用看答案自己完成!

你可能感兴趣的:(高级正则表达式实践)