原文收集在我的GitHub博客(https://github.com/jawil/blog)。交流学习,共同进步,以学习者的身份写博客,记录点点滴滴。肯定有童鞋心存疑虑。他们花了很多时间学习正则表达式,但发现它们毫无用处。正则表达式不就是用来验证邮箱地址的吗,在其他地方基本没什么用。其实大部分人都有这种感觉,所以有的人干脆不学,觉得难,没用。众所周知,要想成为编程高手,就一定要玩转正则表达式。GitHub上优秀的开源库和框架中充斥着强大的正则表达式。jQuery的作者也被称为正则表达式小王子。下面是自己收集的一些工作中使用的正则表达式的精彩用法,处处闪耀着开发者智慧的火花。一个需求的实现方式有很多种,哪个更好,仁者见仁智者见智,这里只是一个对比思考,激发大家学习正则的兴趣,培养正则思维。作为前端开发人员,你总是有自己的绝招。毕竟,前端开发不同于后端。更不用说所有的代码都暴露给用户了。冗余代码少了会影响带宽,多了会降低效率。正则表达式(RegularExpression),这是一块硬骨头,很难嚼,但嚼起来很好吃。所以今天我也来爆一下正则表达式的一些技巧。正规大法好,正规大法好,正规大法好,重要的事情说三遍。1.获取链接https://www.baidu.com?name=jawil&age=23name的值不是正则实现:functiongetParamName(attr){letsearch=window.location.search//"?name=jawil&age=23"letparam_str=search.split('?')[1]//"name=jawil&age=23"letparam_arr=param_str.split('&')//["name=jawil","age=23"]letfilter_arr=param_arr.filter(ele=>{//["name=jawil"]returnele.split('=')[0]===attr})returndecodeURIComponent(filter_arr[0].split('=')[1])}console.log(getParamName('name'))//“jawil”是用正则表达式实现的:functiongetParamName(attr){letmatch=RegExp(`[?&]${attr}=([^&]*)`)//分组运算符是将结果存储在exec函数返回的结果中。exec(window.location.search)//["?name=jawil","jawil",index:0,input:"?name=jawil&age=23"]returnmatch&&decodeURIComponent(match[1].replace(/\+/g,''))//url中的+号表示空格,待替换}console.log(getParamName('name'))//"jawil"不太懂,先研究这个文章:[[JS高级]测试、执行、匹配、替换](https://segmentfault.com/a/11...2.数字格式问题,1234567890-->1,234,567,890非常规实现:lettest='1234567890'functionformatCash(str){letarr=[]for(leti=1;i=1)个数,最后将所有的匹配边界替换为,即可达到目的。3.去掉字符串左右两边的空格,"jawil"-->"jawil"非常规实现:functiontrim(str){letstart,endfor(leti=0;i0;i--){if(str[i]!==''){end=ibreak}}returnstr.substring(start,end-1)}letstr="jawil"console.log(trim(str))//"jawil"是用正则表达式实现:functiontrim(str){returnstr.replace(/(^\s*)|(\s*$)/g,"")}letstr="jawil"console.log(trim(str))//"下巴il"4.判断一个数是不是素数3-->真正的素数也叫素数。指大于1的自然数,除1和整数本身外,不能被其他自然数整除。非常规实现:functionisPrime(num){//不是数字或者数字小于2if(typeofnum!=="number"||!Number.isInteger(num)){ //Number.isInterget判断是否为整数returnfalse}//2为质数if(num==2){returntrue}elseif(num%2==0){//排除偶数returnfalse}//依次判断是否可以被奇数整除,最大循环是取值的平方根letsquareRoot=Math.sqrt(num)//因为2已经验证过了,所以从3开始;偶数已被排除,所以每次加2for(leti=3;i<=squareRoot;i+=2){if(num%i===0){returnfalse}}returntrue}console.log(isPrime(19))//true是用正则表达式实现的:functionisPrime(num){return!/^1?$|^(11+?)\1+$/.test(Array(num+1).",3shouldbewrittenas"111",17shouldbewrittenas"111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.TheJSimplementationisalsoverysimple.IimplementeditinthewayofArray(num+1).join('1').Atfirst本来对这个表达式是持怀疑态度的,但是仔细研究了这个表达式之后,我发现它很有道理,接下来我就带大家分析一下这个表达式的工作原理。首先,我们看到有一个“|”在这个表达式中,也就是说这个表达式可以分为两部分:/^1?$/和/^(11+?)\1+$/第一部分:/^1?$/,我没有这部分需要多说一下,就是匹配“空字符串”和字符串中只有一个“1”的字符串。第二部分:/^(11+?)1+$/,这部分是整个表达式的关键部分。它可以分为两部分,(11+?)和1+$。前半部分非常简单。它匹配以“11”开头并重复0个或n个1的字符串。后半部分的意思是用前半部分作为A字符串匹配剩余字符串1次或多次(这句话的意思是——如果剩余字符串中1的个数是前面1的个数的整数倍细绳)。可以看出这个正则表达式是一个非质数,必须对整个表达式取反才能得到一个质数。通过上面的分析,我们知道第二部分是最重要的。第二部分,这里举几个例子,例子1:判断自然数8。我们可以知道,8转换成我们的格式是“11111111”,对于(11+?),匹配“11”,所以“111111”",1+$正好匹配剩下的"111111",因为模式"11"在"111111"中出现了3次,匹配模式返回true。因此匹配成功,所以这个数不是质数。例2:判断自然数11,转换成我们需要的格式是“11111111111”(11个1),对于(11+?),匹配到“11”(前两个1),剩下“111111111”(九个1)),并且1+$不能匹配"11"的"9个1",因为模式"11"在字符串"9个1"中没有恰好出现N次。所以,我们的正则表达式引擎会尝试下一种方法,先匹配“111”(前三个1),然后以“111”为模式匹配剩下的“11111111”(八个1),显然,那个“八1s”多次不匹配“三个1”。因此,引擎会不断往下尝试……直到所有的可能性都试过了,都无法匹配成功。所以11是质数。通过例2,我们可以得到这样一个等价的算法。正则表达式会匹配这几个1中是否有“两个1”的整数倍、“三个1”的整数倍、“四个1”。“整数倍……,而这正是我们计算素数所需要的算法。现在大家都明白了。”5.字符串数组去重["a","b","c","a","b","c"]-->["a","b","c"]这里只考虑最简单的字符串数组去重,不考虑对象、函数、NaN等,实现这种正则化是吃力不讨好的。非常规实现:①ES6实现letstr_arr=["a","b","c","a","b","c"]functionunique(arr){return[...newSet(arr)]}console.log(unique(str_arr))//["a","b","c"]②ES5实现varstr_arr=["a","b","c","a","b","c"]functionunique(arr){returnarr.filter(function(ele,index,array){returnarray.indexOf(ele)===index})}console.log(unique(str_arr))//["a","b","c"]③ES3实现varstr_arr=["a","b","c","a","b","c"]functionunique(arr){varobj={},array=[]for(vari=0,len=arr.length;i]>教程http://deerchao.net/tutorials/regex/regex.htm30分钟的入门教程,广为流传于网络https://qntm.org/files/re/re.html55分钟教程[英文],http://regex.learncodethehardway.org/book/一本简单的书,每一节都是一段内容https://开关。com/~rsc/regexp/regexp1.html正则匹配原理分析http://stackoverflow.com/tags/regex/infostackoverflow正则标签,标签下有值得点击的链接,一些典型问题http://regexr.com/常规学习和测试在一个https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions由MDN出品,内容验证和测试在JavaScripthttps://regex101.com/在JavaScript,Python,PCRE16-bit,生成模式解释https://www.debuggex.com/正则验证测试,清除https://mengzhuo.org/regex/中文版正则验证测试http://refiddle.com/测试工具http://myregexp.com/也是一个测试工具,可以试试checkpoint模式练习http://regex.alf.nucheckpoint模式练习正则表达式,把正则匹配测试一个一个地完成http://正则表达式。com/通过实战掌握正则表达式https://regexcrossword.com/正则挑战,难度不一,非常丰富http://callumacrae.github.io/regex-tuesday/正则挑战,完成正则匹配要求Othershttps://msdn.microsoft.com/zh-cn/library/az24scfc.aspx微软出品的MSDNhttp://www.jb51.net/tools/regex.htm常用的正则表达式,比如匹配网址、日期等,这个google搜了很多https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/备忘单地址,如下所示