当前位置: 首页 > Web前端 > HTML5

正则系列——正则虐我千百次,我要反抗

时间:2023-04-05 02:17:42 HTML5

如果你的正则化基础是0,请先阅读第一篇:JavaScript正则表达式入门实战心得上一章分享介绍到正则表达式的一些经验和注意事项。本章开始选择一些常见的和更复杂的需求来练习。场景一:验证邮件是否合法。电子邮件的种类太多了,比如net后缀。我们不处理特殊的。下面我找到一些常用的邮箱:hyy@gmail.com谷歌邮箱hyy12@qq.comqq邮箱hyy-123@163.com163邮箱732662@sina.com新浪邮箱hyy@sohu.com搜狐邮箱hyy@hotmail.comhotmai邮箱hyy@189.cn189邮箱hyy@139.com139邮箱1.分析规则xxxprefix:OK是数字、字母的组合,-@:这个单字符匹配可以是后缀:英文或数字.:end点分隔符的:com或cn2,从第一条规则开始匹配前缀可以是数字、字母、-的组合,-的特点是只能写在数字或字母中间,不能放在结尾的两侧。\w+-?\w+//表示数字或字母,中间可以插入-。匹配结果,加粗部分hyy@gmail.com谷歌邮箱hyy12@qq.comQQ邮箱hyy-123@163.com163邮箱732662@sina.com新浪邮箱hyy@sohu.com搜狐邮箱hyy@hotmail.comhotmai邮箱hyy@189.cn189邮箱hyy@139.com139邮箱3.匹配@字符\w+-?\w+@匹配结果,加粗部分hyy@gmail.com谷歌邮箱hyy12@qq.comqq邮箱hyy-123@163。com163邮箱732662@sina.com新浪邮箱hyy@sohu.com搜狐邮箱hyy@hotmail.comhotmai邮箱hyy@189.cn189邮箱hyy@139.com139邮箱4.下面的规则很简单/\w+-?\w+@\w+.(com|cn)/g查看匹配结果场景二:验证时间格式时间格式有很多种,如果要写一个很大的regex来匹配所有的,是非常困难的,下面我们只匹配xxxx-xx-xx。2017-09-151。这里分几个点分析规则。年、月、日年:4位,月首1或2:2位,日首0或1:1位为1-9。有2位时,首位为0-3,第二位数字为0-92。匹配年份和日期是最难写的事情之一。准确地写是非常困难的。第一位为1或2,用(1|2){1},第2-4位为0-9,写成[0-9]{3},组合为年/(1|2){1}[0-9]{3}/g3,matchmonth年和月之间的连接符写成-/(1|2){1}[0-9]{3}-/g的组成月份以0开头以1开头有两种情况,如果以0开头,第一位的0可能不存在,第二位是0-9。如果以1开头,第二位为0-2,组合为(0?[1-9]|1[0-2])/(1|2){1}[0-9]{3}-(0?[1-9]|1[0-2])/g4。当匹配日期第一位为0时,第二位为0-9;当第一位为1时,第二位为0-9,当第一位为2时,第二位为0-9,当第一位为3时,第二位为0-1,则(0[1-9]|1[0-9]|2[0-9]|3[0-1])/(1|2){1}[0-9]{3}-(0?[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])/g5。日期格式有很多种。你应该根据你的工作需要来写规则。这里我列举了这么多,就是练习各种规则的组合。场景三:验证URL是否合法。URL正则化也是一个复杂的场景。我找了几个不同的网址来测试https://segmentfault.com/writehttps://shimo.im/doc/ME90WXr4Hm8nx3Jl?r=PPGD2Dhttps://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQhttps://regex101.com/http://www.baidu.com/#/abouthttp://www.baidu.com这次我们省略步骤,直接分析。首先,开头,2种写法,http://和https:///https?:\/\//g然后看域名,可能是xx.com或者yy.xx.com/https?:\/\/\w+.\w+(.\w+)?\/?/g结束后规则变得很复杂,url域名后面的写法我都不是很清楚,从头开始写的测试集,可以写成如下形式/https?:\/\/\w+.\w+(.\w+)?\/?([\w-_#\/\?=.]+)虽然正则表达式?/g匹配测试样本,但它是有缺陷的。也在网上看了一些其他的写法,试了下也有问题。如何写一个准确率非常高的url正则表达式,还需要你的努力。场景四:获取url的参数。网上的regex是用window.location.search获取问号后面的参数字符。我使用一种新的纯正则表达式实现方法。url可以传也可以不传。functiongetUrlParamName(name,url){if(typeofname!=='string')throwError('mustbeastring')if(!url){//如果没有传url,读取当前网站的urlurl=window.location.href}//匹配name=value的数组letarr=url.match(/(?!(?:(\?|\&)))(\w+)=(\w+)/G);for(letvofarr){//如果某个元素与传入参数形成的字符串匹配,则返回该值。if(newRegExp(name+'=([0-9a-zA-Z]+)','g').test(v)){returnv.match(newRegExp(name+'=([0-9a-zA-Z]+)','i'))[1]}}returnnull}lett=getUrlParamName('r')console.log(t)//PPGD2D方法大家可以抽时间慢慢研究,我在这里教大家一个新知识,叫做零宽度断言。(?!(?:(\?|\&)))(\w+)=(\w+)这里使用的语法如下:分为左右两个括号,左边的(?!(?:(?|&)))表示匹配到?或&,但不是获取这2个符号,而是获取其后的常规模式。s="?r=abc&qId=123"(?!(regularity))(regularity)//匹配的是r=abc,qId=123零宽断言还没掌握完大概意思是得到某个字符或者某个字符前后的某个正则表达式。不高大上,可能有人翻译的时候冒充了名字吧。综上所述,本章分享了4个场景的实践。我不是正则表达式的高手,我才刚刚开始研究正则表达式。我发现学习正则表达式最重要的是知道当前需求的规则。“Norules,noregex”,regex中有很多符号需要记住,下一步要多练习正则题,然后看基础文档巩固知识。一个好的正则大师可以写出性能非常好的表达式。就像js一样,不同的写法也会有性能上的差距。当数据量较小时,可以忽略。在分析长文本时,你需要成为一名优秀的正规高手。下一章:正则表达式理论巩固正则系列文章已经整理到github:https://github.com/hyy1115/Re...