我发现有些字符被这个编辑器擦掉了,但是灰色区域显示正常。灰色区域的代码是什么?刚开始学编程的时候听说正则化,也听说正则化牛逼,懂正则化的就更好了。但是因为没有人指出,也没有用到正则场景,自己看了教程就懵了。到现在为止,我已经发现了入门的窍门。在不同的编程语言中,正则表达式的写法不同。这里我们讨论的是JavaScript正则表达式。学习正则表达式,不要光凭想象,用开发工具来测试一下,推荐大家使用在线正则表达式测试网站:https://regex101.com,或者使用浏览器控制台。最简单的正则化在自然语言处理中被广泛使用。对于前端开发人员来说,最常见的正则化是对表单进行一些验证。如果对正则表达式不熟悉,在写表单的时候,可以直接从网上搜索某个正则表达式,然后复制过来。不过,希望你看完这篇文章后,可以直接写一些简单的正则表达式,不用再百度了。现在介绍最简单的正则(匹配指定的文字):下面是一段漂亮的文字,我们现在要匹配里面的某个词,比如(of)。vars='前世茫茫人海的肩头,种下今生的相遇,在花海中的某朵花中,是你最美的笑容。三千花,只为一个人的留恋,几个春秋,只为等你绽放的身边。多少次来回,在梦中若隐若现,捧着思念的酒杯,在凉爽的夜里轻饮,让回忆的美丽舞动。时间搁浅,无声的缘分结束,远方的风景依旧是你的笑脸。's.match(/of/g)我们使用match方法来做匹配,我们来分析一下这个写法,s表示字符串,g表示全局匹配,去掉g就只能匹配第一个(of)。它是最简单的正则表达式吗?如果需要匹配什么,就把这个字符写在//之间,然后正则系统会自动从字符串中找到它。这样说可能不是很直观。献上一张101的截图,特别注意红框。上面是正则输入框,下面是字符串,右边是匹配的字符:常见的正则方法理解上面的例子,当使用match()时,可以匹配字符,返回值是一个数组.另一个常用的方法是test()。test的返回值为bool类型。通常写在if语句中,判断字符串是否满足正则表达式。它通常用于表单验证。另一种常用的方法是replace()。replace和match类似,可以匹配字符,但是replace还有一个字符替换的第二个参数。下面我们就说说三种方法的具体使用场景。向下看!test()正则表达式中有各种各样的符号,一般都比较难记,但是常用的符号多练习几次就会印象深刻。下面结合实例分析一下test()和regex的实现。以注册表单为例:test()和match()倒写,test写在regex前面,函数参数写字符串。情况一:账号只能是数字。看到这样的题,首先想到2个字——“规矩”。了解规则后,就很简单了。正则规则默认提供匹配数字的字符,d或[0-9],那么直接/d/.test('123')可以吗?当然不是,d表示一个数字,还需要加上一个特殊字符来匹配所有的数字,因为一个字符串有N个数字,必须全部匹配成功。这里我用的是+,加号表示至少匹配一个数字一次,比如123,如果用d,只能匹配[1,2,3]一个一个,需要在match方法中使用,在测试方法中,必须匹配整个字符串,看是否匹配正则模式。改成d+之后,匹配了整个字符串中的数字,是不是很接近我们最终的结果?上面的操作貌似可以匹配数字,但是记住,在test()方法中,如果要验证整个字符串只能是数字,必须加上正则的开始符号^和结束符号$,意思是from字符串'123'必须满足从匹配开始到结束的数字。如果中间插入其他字符'1kk2or3',则匹配失败。所以最终的正则表达式是/^\d+$/,或者/^d+$/g,其中g可以加也可以不加。varuser='123'//可以把123改成任意字符进行测试。if(/^\d+$/g.test(user)){}//写1if(true){}if(/^[0-9]+$/g.test(user)){}//写法2if(true){}场景2:账号匹配后只能是字母数字,会不会换成字母?只需将d或[0-9]更改为常规字母即可。字母包含大小写,所以使用[a-zA-Z]。如果去掉^和$,则只匹配用户字符串是否包含字母,使用indexOf()或includes()代替。varuser='hyy'//你可以把hyy改成任何字符来测试。if(/^[a-zA-Z]+$/g.test(user)){}//if(true){}场景三:账户只能以字母开头,字母和数字的组合,长度范围是6-10。打了2轮单打,还是不够爽,来一组组合拳吧。我学会了^$[0-9][a-zA-Z]+上面这些正则符号的用法。一定要把它们写下来,它们很常用。这个组合看起来有点复杂,但不要害怕。遇到这种问题,我们第一步就是抽取规则:字母的开头;字母和数字的组合;长度为6-10。1.你必须想一想/^what?$/.test(user)的结构。2.以字母开头,则第一个字符必须是字母。需要学习一个新的正则表达式,大括号{n,m},x{1}表示匹配前一个字符一次,x{2}表示匹配匹配x的字符两次,也可以写成x{1,3},表示符合x正则的匹配最少1次,最多3次。如果您不能立即理解这段话,请跳过它。我们只看{1}的情况。所以,加上以字母开头的规则后,正则化就变成了/^[a-zA-Z]{1}}/,注意我暂时没有写结束符,在结尾。/^[a-zA-Z]{1}}/3,字母和数字的组合,要写成[a-zA-Z]d吗?其实还有更好的办法,你学习了一个新的正则w,w和([a-zA-Z]|d)一样,都是代表字母和数字的组合。顺便说一下()和|这两个正则表达式的含义。在正则化中,()代表一个群,即一个群,|代表或,所以([a-zA-Z]|d)表示字母或数字,然后用()括起来组成一个正则组。如果你觉得括号很复杂,就用w。/^[a-zA-Z]{1}\w/4.最后,它几乎完成了。最后一条规则的长度为6-10。如果不想用正则表达式,也可以根据字符串的长度来判断长度,所以如果是的话,上面的正则表达式可以直接用结束符$。我悄悄在\w后面加了一个+,因为后面所有的字母和数字至少要匹配一次,然后写$结束:if(/^[a-zA-Z]{1}\w+$/g。test('Hyy123')&&'Hyy123'.length>5&&'Hyy123'.length<11){}但是自从学了正则化之后,用正则化的方式其实更容易解决。使用上面学习的大括号{},我们可以轻松实现长度控制。直接给你看最终形式:if(/^[a-zA-Z]{1}\w{5,9}$/g.test('Hyy123')){}//true这个最终形式的规律性可以拆分成几个部分:^:开头[a-zA-Z]{1}:第一个字符匹配一次,只能是字母\w{5,9}:后面的字符都是字母或者数字组合,长度为6-10,因为第一个字符占了一个长度,所以这里匹配5-9的长度$:endscene4:密码只能是6位。这个要简单得多。规则是数字在前,然后是长度6。最后一个g是可选的。/^\d{6}$/match()test()通常用来验证一个字符串是否符合某种规则,match()是从字符串中提取出满足某种规则的字符。前端用到match的场景不多,但是微信小程序对话系统的emoji包使用了特定的规则。给朋友发微信消息的时候,一般都是直接点击某个表情然后发送,但其实也可以输入一些字符组合再发送。在聊天界面,微信系统会自动匹配某个表情。这里我猜测是用match做的字符串处理,也可能是有什么我不知道的高级技术。下面以一个组合拳的例子来介绍下match的使用场景:1、有这么一段文字:我是一名前端工作者。我已经工作一年了。现在失业了,想去腾讯工作。这是我的联系方式:155275788462。假设你是来应聘前端工程师的。我是面试官。我会给你几个要求。从这段话中,提取联系信息和工作年限。你该怎么办??3。有时候前端也会遇到类似的需求。第一步,分析规则:联系方式:联系方式可能有很多种,比如手机号,微信,QQ,座机号等等,嗯,这样看确实很复杂,所以我们只考虑手机号码的情况。工作年限:工作年限为阿拉伯数字。4.考虑用什么方法来匹配,测试还是匹配?这里是lookatmatch,先分析第一个,提取联系方式,或者提取手机号码。手机号码本身也有特定的规则:以1开头;长度为11;第二个数字是3或5或7;第三到第十一位是0到9的数字,可能会有更详细的手机号码规则。您可以上网查询手机号码的组成规则。5.现在开始用正则表达式来匹配吧,别怕,很简单。看第一篇,1开头的,什么,开头又想到/^1/了。对不起,你写错了。因为字符串的开头是“I”,所以可以改变写法。/1/6.长度是11位,这个很重要,不过后面会匹配长度,先看第二位3,5,7的规则,写成正则组是(3|5|7)./1(3|5|7){1}///在这里添加{1},匹配一次括号内的规则。这将匹配字符串中的15。7、第3到11位是0-9的数字,那么就是d{9},因为后面还有9位,所以匹配9次就够了。/1(3|5|7){1}\d{9}///匹配结果为155275788468,看完整的写法,匹配结果为数组,vars='我是前端,工作1年,现在失业,想在腾讯工作,这里是我的联系方式:15527578846'//加g匹配完整正则s.match(/1(3|5|7){1}\d{9}/g)//['15527578846']//虽然不加g来匹配完整的正则模式,但也匹配()中的小正则模式。s.match(/1(3|5|7){1}\d{9}/)//["15527578846","5",index:35,input:"我是前端,一直工作1年,现在失业,想在腾讯工作,这是我的联系方式:15527578846"]9.虽然这个正则表达式提取了手机号码,但并不完美。更准确的匹配需要判断开始和结束后面不能跟其他数字。比如991552757884699,这样还是会提取99中间的11位,当然这不是当前场景考虑的问题。10.分析第二个是工作年限。工作年限有一个特点,就是它是一个数字,而且必须在“年”之后,在“工作”之前。这样一来,规则就很简单了。问号?正则表达式中的表示问号前的规则匹配0次或1次。这意味着如果“工作”不存在,则正则表达式也为真。例如,原句是“workingfor1year”,变成“1year”。一样可以搭配。s.match(/(work)?(\d{1,2})Year/)//(\d{1,2})至少1次,最多2次,我不信你工作过100年。//["Workingfor1year","Working","1",index:7,input:"我是前端工作者,已经工作1年了,现在失业了,想在腾讯。这是我的联系方式:15527578846"]s.match(/(work)?(\d{1,2})year/)[2]//目标结果1replace()是前面很常用的方法-结束发展。我们来看几个场景:场景一:将字符串中的逗号替换为感叹号vars='Iamafront-endworker.我已经工作了1年。现在失业了,想去腾讯工作。下面是我的联系方式:15527578846's.replace(/,/g,"!")//"我是前端!已经工作1年了!现在失业了!我想去腾讯工作!这个是我的联系方式:15527578846》场景二:将手机号后8位替换为*1。首先得用test判断是不是手机号,然后执行替换语句。2.使用match提取电话号码的后8位。'15527578846'.match(/^\d{3}((\d){8})$/)//["15527578846","27578846","7",index:0,input:"15527578846"]varr='15527578846'.match(/^\d{3}((\d){8})$/)[1]//"27578846"3.然后执行replace去匹配变量r,然后执行更换。'15527578846'.match(/^\d{3}((\d){8})$/)//["15527578846","27578846","7",index:0,input:"15527578846"]varr='15527578846'.match(/^\d{3}((\d){8})$/)[1]//"27578846"'15527578846'.replace(r,'********')//"155********"4、我们可以把这个过程封装成一个函数。functionregexTest(tel){if(typeoftel!=='string')throwError('不正确的类型!');tel.match(/^\d{3}((\d){8})$/);varr=tel.match(/^\d{3}((\d){8})$/)[1];返回tel.replace(r,'********');}regexTest('15527578846')//"155********"总结了你在本章所学的是正则表达式的介绍。掌握这些常用的语法和编写正则表达式的思路。对于一些简单的正则表达式,您应该能够自己编写它们。后面会继续和大家分享各种正则需求的实现思路。下一章:正则正则实战篇正则正则系列文章已经整理到github:https://github.com/hyy1115/Re...
