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

regex一分钟复习

时间:2023-04-02 11:49:32 HTML

平时工作中经常遇到regex,但是发现每次都忘记怎么写了,所以这里稍微复习一下总结先看题/*题目1*/varstr1='123456765464153513566'//每三个数字用逗号分隔(从后到前)//如1234->1,234/*Topic2*/varstr2="get-element-by-id"//将-将命名方式改为小驼峰//预期结果getElementById/*Topic3*/varstr3='getElementById'console.log(str3.replace(/([a-z])([A-Z])/g,'$1-$2').toLowerCase())//把运行结果写出来看完这三道题,你有什么想法了吗?把答案贴在下面//问题1console.log(str1.replace(/(\d)(?=(\d{3})+$)/g,'$1,'))//123,456,765,464,153,513,566//话题2console.log(str2.replace(/-\w/g,($0)=>{return$0.slice(1).toUpperCase()}))//getElementById//主题3//get-element-by-id如果你的答案都正确,请忽略下面的内容,复习一下简单的匹配规则如果你想在单词apple中查找字符a,直接使用正则表达式/a/即可。如果要匹配*,需要用\转义去掉它的原意,regex可以写成/\*/。有些字符根本不是特殊字符。寓意符号会使它具有特殊的意义。特殊字符正则表达式记忆模式newlinennewlineformfeedfformfeedcarriagereturnrreturnblanksspacetabttabverticaltabvverticaltabbackspace[b]backspace,之所以使用[]符号是为了避免与b重复匹配。定义多字符集的方式是使用方括号[和],比如/[123]/这种正则模式可以同时匹配1、2、3个字符。使用/[0-9]/匹配所有数字,使用/[a-z]/匹配所有英文小写字母。一个同时匹配多个字符的简单正则表达式:正则表达式在匹配区间内的记忆方式除换行符外。句点以外的任何字符。句号,除句末字符单个数字,[0-9]ddigitexcept[0-9]Dnotdigit单个字符包括下划线,[A-Za-z0-9_]wword非单词字符Wnotword匹配空白字符,包括空格、制表符、表单提要和换行符sspace匹配非空白字符Snotspace重复匹配元字符?表示匹配一个字符或者0个字符,比如匹配color和colour这两个词,可以写成/colou?r/metacharacter*来匹配0个字符或者无限个字符。比如匹配colour和colouuuuuur,可以写成/colou*r/metacharacter+来匹配同一个字符1的出现一次或者多次。对于color和colour这两个词,如果使用/colou+r/来匹配,只能匹配color特定的次数,可以使用元字符{和}来设置重复匹配的精确范围。如果我想匹配3次,那么我将使用/a{3}/正则,或者如果我想至少匹配两次,我将使用/a{2,}/正则。{x}:x次{min,max}:在最小时间和最大时间之间{min,}:至少最小时间{0,max}:最多最大时间summary|匹配规则|元字符||:-----:|:----:||0次或1次|?||0次或无限次|*||1次或无限次|+||具体时间|{x},{min,max}|位置边界词boundary\b,例如猫把食物撒得到处都是。匹配所有单词cat,可以写成/\bcat\b/g字符串边界,元字符^用于匹配字符串的开头,元字符$用于匹配字符串的结尾。边界总结:边界和标志正则表达式内存模式字边界bboundary非字边界Bnot边界Stringstart^-stringend$-multilinemodemflagmultipleoflinesignorecaseiflag忽略大小写,不区分大小写的全局模式gflag全局子表达式分组所有由(和)元字符括起来的正则表达式被分组,每个分组都是一个子表达式,这也是高级正则表达式的基础。Backreference后向引用(backreference)指的是子串后面已经匹配过的部分。你可以把它想象成一个变量,反向引用语法就像\1,\2,....,其中\1代表引用的第一个子表达式,\2代表引用的第二个子表达式,以此类推在。\0表示整个表达式。//例如//匹配以下字符串中的两个连续单词//Hellowhatisthefirstthing,andIamscq000.varstr4='Hellowhatwhatisthefirstthing,andIamscq000.'console.log(str4.match(/\b(\w+)\s\1/g))使用$1,$2...来引用要替换的字符串varstr='abcabc123';str.replace(/(ab)c/g,'$1g');//得到结果'abgabg123'如果我们不希望子表达式被引用,我们可以使用非捕获正则(?:regex)来避免浪费内存。varstr='scq000'.str.replace(/(scq00)(?:0)/,'$1,$2')//返回scq00,$2//由于使用了非捕获,第二个引用没有值正则表达式,直接替换成$2varstr4='scq000scq001'console.log(str4.replace(/(scq00)(?:0)/,'$1,$2'))//returnscq00,$2scq001lookforwardto查找(lookahead)用于限制后缀。(?=regex)中包含的任何子表达式在匹配过程中将用于限制匹配前一个表达式。比如happyhappy这两个词,我想得到happ开头的副词,然后用/happ(?=ily)/来匹配,就可以匹配happy这个词的happ前缀。如果我想过滤所有以happ开头的副词,我还可以使用否定前瞻规则/happ(?!ily)/,它将匹配happ词的happ前缀。Look-behind后向查找(lookbehind)就是指定一个子表达式,然后从匹配该子表达式的位置开始查找符合规则的字符串。一个简单的例子:apple和people都包含后缀ple,那么如果我只想找apple的ple怎么办?我们可以通过限制前缀app来唯一确定这个词ple。varstr4='applepeople';console.log(str4.replace(/(?<=ap)ple/,'-'))//得到结果'ap-people'//表示匹配到apple这个词ple(?<=regex)的语法是向后搜索。regex引用的子表达式将作为限制项进行匹配。匹配到这个子表达式后,会继续向后查找。另一种限制性匹配是使用(?1,234console.log(str1.replace(/(\d)(?=(\d{3})+$)/g,'$1,'))//123,456,765,464,153,513,566解析:\d表示a单个数字,(?=(\d{3})+$)是正向查找,\d{3})+$表示匹配3位数字一次或多次,并以三位数字结尾。一起来看,匹配到一个数字,数字后面的位数是3的倍数,所以匹配到的数字是3,6,5,4,3,3,然后换成$1,所以3是replacewith3,,replace6with6,....Topic2/*Topic2*/varstr2="get-element-by-id"//将-的命名方式改为小驼峰//预期结果getElementByIdconsole.log(str2.replace(/-\w/g,($0)=>{return$0.slice(1).toUpperCase()}))解析:首先,/-\w/g表示匹配前面的所有单曲by-字符,匹配结果为-e,-b,-i,然后取第二个数字(即截取-),然后转为大写Topic3/*Topic3*/varstr3='getElementById'安慰。log(str3.replace(/([a-z])([A-Z])/g,'$1-$2').toLowerCase())//写出运行结果//答:get-element-by-id解析:([a-z])([A-Z])表示匹配两个字母,第一个小写,第二个大写,所以匹配结果为tE,tB,yI,因为()代表分组,所以$1代表匹配的小写字母,$2代表匹配的大写字母参考:不要背正则表达式