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

JS正则表达式学习笔记1

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

正则表达式是前端学习的一个知识点,每个合格的前端开发者都应该掌握它的用法。学习正则表达式真的不难,语法和应用也很简单,可以很快上手,很容易写出简单的表达式对字符串进行某些操作。网上也有头条说一杯咖啡就能学会。你能学会吗?有能力的!但是真正掌握它并不容易,就像打篮球一样,40分钟的课就可以学会基本的规则和投球方法,但是要想做得很好,就需要长时间的练习,而学习正则表达式是同样,其实学习任何知识和技能都是如此。只有长期练习,尽可能少犯错误,才能做到专业;有:表单验证,验证email,验证手机是否为空等。替换字符串,在字符串开发工具中搜索替换。简单来说,正则表达式就是字符串操作的逻辑公式,使用一些约定好的字符组合对字符串进行查找、匹配、替换等操作。本文将学习路径分为两个阶段:第一阶段,熟悉正则表达式,有正确的认识,能够编写简单的正则表达式来操作字符串;第二阶段,熟练使用正则表达式的一些高级用法,掌握心法,在需要的时候,信手拈来。第一阶段需要掌握的内容包括:如何定义正则表达式定义正则表达式,在那些方法中使用元字符,字符类&字符转义范围&量词分支条件反义定义正则表达式有两种方式:通过实例化RegExp构造函数,有两个参数,第一个是表达式,第二个是修饰符。使用文字值在两个反斜杠之间写入正则表达式。反斜杠是一个表达式,后面跟着修饰符。Last/behindDEMO//实例化RegExp类定义constreg=newRegExp("\\d",'g');//字面值//定义constreg=/\d/g;letstr="mmcai18is94a99boy";letresult=str.replace(reg,"")console.log(str)//Result:mmcai18is94a99boyconsole.log(result)//Result:mmcaiisabody//字符串的replace方法不会修改原来的字符字符串,将返回一个新的字符串修饰符g:全文搜索,匹配到第一个时结束i:忽略大小写m:多行搜索对象属性global:对象是否有标志g;结果是一个布尔值ignoreCase:object是否有标志i;结果是布尔值lastIndex:一个整数,标识下一个匹配开始的字符位置;结果是一个数字multiline:对象是否有标志m;resultisbooleansource:正则表达式的源文本;结果是字符串letpatt=/[a-z]\d/gim;patt.global=true;patt.ignoreCase=true;patt.multiline=true;patt.source="[a-z]\d"工作空间其实要表达这里可以在这些方法上使用正则表达式;应用场景可以分为两种情况。正则对象本身的一些方法测试:检索字符串中指定的值。返回true或falseexec:检索字符串中指定的值。查找返回数组,否则返回nullcompile:改变正则表达式,在一些字符串操作方法中不常用String.replace:替换匹配正则表达式的字符串String.search:检索匹配正则表达式的值String.split:将字符串拆分为字符串数组String.match:查找一个或多个匹配的正则表达式DEMO//测试判断字符串是否符合我们定义的规则//验证表单时,可以使用test验证:手机号码、邮箱、身份证号、银行卡等数据合法letpatt=/1[35789]\d{9}/;letstr="13588322792"letflag=patt.test(str);console.log(flag);//exec当没有global修饰符时,函数同match函数。匹配则返回数组,否则返回null//将以下代码放入编辑器中查看结果varstr="Iloveantzone,thisisanimate";varreg=/[a-z]{2}/;varresult=reg.exec(str);console.log(result);//result数组至少有两个值,加上两个属性input和index-result[0]:匹配的string-result[1]:存储第一组匹配的值,否则未定义-result[2]:存储第二组匹配的值,否则不改变item-result[n]:存储第n组匹配的值,否则有没有这个item返回值也是一个数组,在字符串中只能匹配一次。不过这个时候一般会使用这个函数来匹配lastIndex属性。此函数将在lastIndex属性指定的字符处开始检索字符串。当exec()找到匹配表达式的字符串时,在匹配之后,它会将lastIndex属性设置为匹配字符串的最后一个字符的下一个位置。您可以通过重复调用exec()函数来遍历字符串中的所有匹配项。当exec()函数无法再找到匹配的文本时,它将返回null并将lastIndex属性重置为0。数组的内容结构与没有g修饰符的情况完全相同。varstr="thename123and456";varreg=/\d/g;reg.lastIndex=15;console.log(reg.exec(str));String.search搜索不进行全局匹配,忽略修饰符G。如果匹配,则返回匹配值的索引,否则返回-1varstr="VisitW3School!"varr=str.search(/w3school/);console.log(r);String.replace返回一个新的字符串,是替换后得到的新值。replace有两个参数:第一个可以是字符串,也可以是正则表达式;第二个可以是字符串或函数;如果第二个是字符串,则字符串中的$字符有特定含义的字符说明$1...$99子表达式$&匹配的文本和regexp要匹配的字符串$`左边的文本子匹配字符串$'子表达式匹配内容右边的文本$$文字符号1.简单用法varstr="VisitMicrosoft!"varres=str.replace(/Microsoft/,"W3School");控制台日志(资源);2.修饰符g,全局匹配varstr="WelcometoMicrosoft!"str=str+"我们自豪地宣布,Microsoft拥有"str=str+"世界上最大的Web开发人员站点之一。"varres=海峡。替换(/Microsoft/g,“W3School”);日志(资源);3.修饰符i,忽略大小写vartext="javascriptTutorial";varres=text.replace(/javascript/i,"JavaScript");console.log(res)4.角色$varname="Doe,John";varres=name.replace(/(\w+)\s*,\s*(\w+)/,"$2$1");控制台日志(资源)5。varname='"a","b"';varres=name.replace(/"([^"]*)"/g,"'$1'");6.第二个参数是函数varname='aaabbbccc';varuw=name.replace(/\b\w+\b/g,function(word){returnword.substring(0,1).toUpperCase()+word.substring(1);});String.match如果匹配则返回一个数组,数组结构参考上面的exec方法,否则返回nullvarstr="你好,世界!"varres1=str.match("world");varres2=str.match("World");console.log(res1);console.log(res2);varstr="1加2等于3"varres3=str.match(/\d+/g);console.log(res3);String.split将字符串拆分成字符串数组,返回字符串数组。1.varstr="你今天过得怎么样?"varres1=str.split("");varres2=str.split("");varres3=str.split("",3);2.varwords=str.split(/\s+/)3."hello".split("")元字符通常,正则表达式的一个字符对应字符串的一个字符。如果我们要匹配一类字符,可以使用元字符来处理。常用的元字符有:代码描述。匹配除换行符以外的任意字符w匹配字母或数字或下划线或汉字s匹配任意空白字符(包括空格、制表符、换行符、中文全角空格等)d匹配数字b匹配单词的开头或结尾^匹配字符串的开头$匹配字符串的结尾DEMO1。匹配前后有空格字符串letreg=/\b\w+\b/g;letstr="mynameismmcai";str.replace(reg,"xx");2.将时间格式从20190718修改为2019/07/18letreg=/\s/g;letstr="20190718";str.replace(reg,"-");3.匹配不是特殊符号的字符串varstr="Give100%!";varpatt1=/\w/g;4。匹配以Isvarstr="Isthishis";varpatt1=/^Is/g;5开头的字符串。全局搜索数字varstr="Give100%!";varpatt1=/\d/g;6.匹配字符串结尾isisvarstr="Isthishis";varpatt1=/is$/g;characterclass&rangeclass&characterescape查找数字,字母或者数字,blank我们可以根据上节提到的元字符进行匹配。但是,如果您要匹配的字符集没有预定义的元字符集怎么办?这时候我们可以通过定义字符类来进行匹配。例如[.?!]——匹配形式符号(.or?or!)[abc]——匹配字符a或b或c[aeiou]——匹配任意英文元音字母除了以上方法,我们还可以通过——指定字符范围。例如[0-9]——匹配0到9的任意数字,含义与\d元字符相同[a-zA-Z]——匹配26个英文字符,大小写均使用元字符[]构造特征一个简单的类使用-characters来定义字符范围。所谓类就是满足某种特性的对象,泛指,不是某种特性DEMO1。匹配以a或b或c开头后跟数字的字符varreg=/[abc]\d/g;varstr="a1b2c3d4";str.replace(reg,"-");//result="---d4";2。匹配a和h之间的字符varstr="Isthisallthereare?";varpatt1=/[a-h]/g;字符转义比较容易理解。所谓转义,其实就是对我们的元字符进行转义。有时候我们需要自己去匹配那些元字符,可以通过在元字符前加字符串进行转义;例如,下面的一些例子://matchmetacharacters.letreg=/\./;//matchmetacharacters/letreg=/\////Matchmetacharacters*letreg=/\*///[]letreg=/\[\]///匹配\本身letreg=/\\/;量词是匹配的次数,我们可以通过一些限定符类指定匹配的重复次数代码说明|重复0次或多次|重复一次或多次?|重复0次或一次{n}|重复n次{n,}|重复n次或更多次{n,m}|重复n到m次DEMO//匹配字符window后跟1个或多个数字letreg=/window\d+/;//匹配字符的第一个单词letreg=/^\w+///匹配的字符串时间格式YYYY-MM-DDletreg=/\d{4}(-\d{2}){2}$/;letstr="2019-07-18";//为了避免匹配像这样的字符串“2019-07-1234124”,添加$结尾符号reg.test(str)分支条件有时候我们匹配的时候,规则不是单一的,可能有多个规则,我们可以通过分支条件来实现。比如我们要匹配座机,有的是三位区号和八位本地号码,有的是四位区号和七位本地号码,我们可以这样写:letreg=/0\d{2}-\d{8}|0\d{3}-\d{7}/DEMO1。匹配IPletreg=/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/letstr="192.168.0.253";reg.test(str);//^必须加,否则会匹配15.168的反义。315.168.0.254等字段中的0.254反义词则相反,例如d匹配数字,D匹配非数字字符,s匹配空白字符,S匹配非空白字符。在字符类中,我们也可以用^表示反义,1匹配abc以外的字符,常见的反义代码如下:代码说明W匹配任意非字母、数字、下划线、汉字的字符S匹配任意非空白字符的字符字符D匹配非数字的任何字符B匹配非单词开头或结尾的任何字符2匹配除x之外的任何字符3匹配除aeiou之外的任何字符DEMO参考匹配IP地址,如何匹配。这个元字符的abc?x?aeiou?