正则表达式应用
上一篇文章跟大家介绍了正则表达式的一些常见知识点和相关例子,那这篇文章我就来分享一下自己在工作当中所遇到的跟正则表达式有关的运用案例,看看它在我的工作中发挥了怎样的作用。
应用场景
正则表达式的应用场景有很多,一般是用来验证字符串,提取字符串和替换字符串。
- 给一个字符串,把字符串里面的链接、数字、电话等显示不同的颜色;
- 给一个包含自定义表情的文字,找出里面的表情,替换成本地的表情图片;或者一个字符串进行替换
- 根据用户的输入内容,判断是否是微信号、手机号、邮箱、纯数字等
我在工作当中遇到的例子有好几个,贴出来让大家参考一下:
例1:将银行卡号的倒数第四位之前的四个数字变成*
解析
:
银行卡的位数实际是不固定的,如果按照字符串替换的方式的话,就要对银行卡的位数进行判断,然后再进行替换,需要做多次if-else判断,这样代码实际上是非常臃肿难看的。
所以我们尝试着用正则表达式来解决一下。
先来看银行卡的规律,银行卡数字在15~19之间,第一个数字不能是0,在这里我们要对倒数第4位前面的4位数进行替换,必然要使用到分组。按照正则里面分组的知识点,分组从左到右依次是组1,组2,组3,依次类推,比如组1,可以用1或者$1来表示。
来看具体代码:
let reg8 = /^([1-9]{1}\d{6,10})\d{4}(\d{4})$/ let str8a = '370248145284512' //15 let str8b = '3702481452845125' //16 let str8c = '3702481452845125832' //19 console.log('---------银行卡号-----------') console.log(str8a.replace(reg8,`$1****$2`)) // 3702481****4512 console.log(str8b.replace(reg8,`$1****$2`)) // 37024814****5125 console.log(str8c.replace(reg8,`$1****$2`)) // 37024814528****5832
例二: 判断文本当中的年月日
解析
:
时间的判断是非常常见的,上一篇文章当中我们讲述捕获分组和非捕获分组时聊到了时间的判断,现在我们来看看简化版的时间的判断。
小时是0-23小时,分和秒都是0-59,根据它们的规律我们可以使用分组和修饰符来找到全文的时间。
具体代码:
let reg = /((2[0-3])|([0-1]\d))(:[0-5]\d){2}/g let str = '现在的时间是12:23:44,下一刻应该是12:55:22,但绝不是24:13:34' console.log(str.match(reg)) // ["12:23:44", "12:55:22"]
例3: 对选中部分数字进行筛选
选出8**0,9**0,同时不包含8200, 8310, 8520, 8440, 8320, 8100, 8920, 8800, 8180, 8010, 8480, 8150解析
:
这个是同事的一个需求,开始我的想法是写两个正则表达式,一个将8**0,9**0的数字选出来,一个将不包含的数字选出来,然后从前面的数字当中剔除掉后面的那些数字。
两个正则表达式为:
re1 = /[8-9]\\d{2}0/g
reg2 = /8(200|310|520|440|320|100|920|800|180|010|480|150)/g
但是同事告诉我只能用一个表达式做出来,那么就要使用到之前所说的零宽度反向预查了。已知第一个数字后面一定不为200,那么使用零宽度反向预查来进行筛选。
let str9 = '8200, 8310, 8520, 8440, 8320, 8100, 8920, 8800, 8180, 8010, 8480, 8150, 3434,545656,8544,6554,8900,9330,9120,8333,8200,9200' let reg9 = /(8(?!(200|310|520|440|320|100|920|800|180|010|480|150))\d{2}0)|(9\d{2}0)/g console.log(str9.match(reg9)) // ["8900", "9330", "9120", "9200"]
这个表达式第一个数字是8或者9,分别进行判断,8后面一定不为题目要求的数字,零宽度反向预查和\b
一样虽然会限定匹配内容,但实际上是不会匹配到任何内容的。