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

正则表达式

时间:2023-03-26 23:40:28 JavaScript

1。什么是正则表达式(1)正则表达式是由一系列字符组成的搜索模式;(2)当你在文本中搜索数据时,你可以使用搜索模式来描述你想要查询的内容;(3)正则表达式可以是简单的字符,也可以是更复杂的模式(4)正则表达式可以用于所有的文本搜索和文本替换操作。2、正则表达式的创建(1)字面量(直接量)varreg=/正则表达式/修饰符;varreg=/你好/img;(2)constructorvarreg=newRegExp('正则表达式','修饰符');varreg=newRegExp('你好','img');其中i为ignoreCase,表示匹配时忽略大小写m表示multiline表示多行匹配g表示global表示全局匹配3.正则表达式实例方法(1)exec()用于匹配字符串中匹配正则表达式的字符串。如果匹配到,则返回一个数组[匹配到的内容,索引:匹配在str中的起始位置,输入:参数字符串,组:undefined]如果没有匹配到,则返回null。(2)test()用于测试待检测字符中是否存在匹配正则表达式的字符串,存在则返回true,否则返回false。注意:以上两种方法会区分是否是全局的。(3)toString/toLocaleString()将正则表达式的内容转换成文字字符串(4)valueOf()返回正则表达式本身4.正则表达式实例属性(1)lastIndex没有设置全局匹配时,值Always0.设置全局匹配时,每次执行exec/test匹配时,lastIndex都会移动到匹配字符串的下一个位置。当指向的位置之后没有可以再次匹配的字符串时,下次执行exec()返回null,执行test()返回false,然后将lastIndex置零,开始新一轮匹配从字符串的开头执行。(2)ignoreCase,global,multiline(3)source以文字形式返回正则表达式5.字符集字符集,也叫字符组。匹配集合中的任何一个字符。您可以使用链“-”指定一个范围。(1)[abc]查找方括号之间的任意字符varreg=/[abc]/console.log(reg.test('abcqweabd'));只要包含a或b或c都返回true(2)[0-9]找到0到9(3)[^xyz]中任意数字的反义词或增补字符集,也叫反义词。也就是说,它匹配任何没有括在括号中的字符。还可以使用连字符“-”指定字符范围。(4)边界符^匹配输入的开头。指示匹配行开头的文本(以谁开头)。如果多行标志设置为真,这个字符也将匹配换行符后的开头。$匹配输入的结尾。指示与行尾匹配的文本(与谁)。如果多行(multiline)标志被设置为真,字符也会在结束前匹配一个换行符。如果^和$在一起,则必须完全匹配。varrg=/abc/;///abc/只要字符串包含abc就返回trueconsole.log(rg.test('abc'));//真console.log(rg.test('abcd'));//trueconsole.log(rg.test('aabcd'));//trueconsole.log('---------------------------');//必须以abc开头才能满足varreg=/^abc/;console.log(reg.test('abc'));//真正的控制台。日志(reg.test('abcd'));//trueconsole.log(reg.test('aabcd'));//falseconsole.log('--------------------------');//必须是以abc结尾的字符串才能满足varreg=/abc$/;console.log(reg.test('abc'));//trueconsole.log(reg.test('qweabc'));//trueconsole.log(reg.test('aabcd'));//falseconsole.log('------------------------');varreg1=/^abc$/;//精确匹配要求必须是abc字符串才符合规范console.log(reg1.test('abc'));//trueconsole.log(reg1.test('abcd'));//falseconsole.log(reg1.test('aabcd'));//falseconsole.log(reg1.test('abcabc'));//false(5)字符集与“^”和“$”一起使用//三个选择中只有一个是a或b或c返回truevarrg1=/^[abc]$/;console.log(rg1.test('aa'));//falseconsole.log(rg1.test('a'));//trueconsole.log(rg1.test('b'));//trueconsole.log(rg1.test('c'));//trueconsole.log(rg1.test('abc'));//false//26个英文字母任意一个返回true——表示范围从a到zvarreg=/^[a-z]$/console.log(reg.test('a'));//trueconsole.log(reg.test('z'));//trueconsole.log(reg.test('A'));//false//字符组合//26个英文字母(大小写均可)对任意字母返回truevarreg1=/^[a-zA-Z0-9]$/;//在反转方括号内加上^表示反转,只要包含方括号内的字符,都会返回falsevarreg2=/^[^a-zA-Z0-9]$/;console.log(reg2.test('a'));//falseconsole.log(reg2.test('B'));//falseconsole.log(reg2.test(8));//false控制台.log(reg2.test('!'));//true(6)\b匹配一个零宽的词边界,意思是词(不是字符)边界,也就是词和a之间的位置空格,或字符(\w)与字符串的开头或结尾之间。\B匹配一个零宽度的非单词边界,与“\b”相反。varstr='你好世界你好JavaScript';varreg1=/\bHello\b/g;varreg2=/\BScrip\B/g;控制台日志(reg1.exec(str));console.log(reg2.exec(str));(7)字符类。匹配除换行\n和回车外的任意单个字符,等价于**[^\n\r]**\d匹配一个数字字符,等价于[0-9]\D[^0-9]\w匹配包括下划线在内的任意单个字符,包括A~Z、a~z、0~9和下划线**"_"**,等价于In[a-zA-Z0-9_]\W[^a-zA-Z0-9_]\s匹配任何Unicode空白字符,包括空格、制表符、换页符等,等同于[\f\t\n\r]\S[^\f\t\n\r](8)量词*>=0次+≥1次?0或1次{n}n次{n,}≥n次{n,m}n到m次6.案例(1)匹配QQ号//不能以数字0开头,只由数字组成,且长度为5-11位数字varreg=/^[1-9]\d{4,10}$/;varstr1="12311111111";varresult1=reg.exec(str1);console.log(result1);(2)匹配身份证号//不能以数字0开头,只能由数字组成,最后一位可能是x,X,数字varreg=/^[1-9]\d{16}[xX\d]$/;varstr="456337189654326541";varresult=reg.exec(str);控制台日志(结果);(3)验证是否为有效的11位手机号码?以1开头,第二位为3、4、5、7、8中的任意一个,以0-9的9个整数结尾varreg=/^1[34578]\d{9}$/;varstr='18376436798';控制台.log(reg.exec(str));(4)varpattern=/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!|@|#|%|&])^([a-zA-Z0-9!@#%&]{6,})$/console.log(pattern.test('Ad5d6!'));7.重复法(1)贪心模式:尽可能多地匹配(先取最大匹配数为一组进行匹配),当剩余的字符串都匹配完后,继续尝试新的匹配,直到找不到匹配为止,默认模式//对于字符串“123456789”,匹配数字3-6次:\d{3,6},先匹配数字出现6次的字符串(123456),再从剩下的字符串(789)开始匹配有3个数字,如果没有3次数字,则剩余字符将停止匹配。varstr="123456789";varreg=/\d{3,6}/g;console.log(reg.exec(str));//['123456',索引:0,输入:'12345678',组:未定义]console.log(reg.exec(str));//['789',index:6,input:'123456789',groups:undefined]console.log(reg.exec(str));//null(2)非贪心模式:尽可能少的匹配(每次取最少的匹配个数为一组进行匹配),直到一个匹配未结束//对于字符串“123456789”,匹配数字3-6次:\d{3,6},先匹配数字出现3次的字符串(123),再从剩余字符串(456789)中匹配数字3次,如果剩余字符做未出现3次,比赛将停止。varstr="123456789";varreg=/\d{3,6}?/g;console.log(reg.exec(str));//['123',索引:0,输入:'123456789',组:未定义]console.log(reg.exec(str));//['456',index:3,input:'123456789',groups:undefined]console.log(reg.exec(str));//['789',索引:6,输入:'123456789',组:未定义]8。选择、分组、引用(一)选择符“|”用于分隔字符以供选择。选择项的匹配顺序是从左到右,直到找到匹配项。如果左侧的选择项匹配,则忽略右侧的匹配项,即使它可以产生更好的结果匹配varreg=/html|css|js/console.log(reg.exec('qweqwehtmlcss'));//html(2)组下面的正则表达式可以匹配'briupbriupbriup'/briupbriupbriup/另一种更优雅的写法是:/(briup){3}/(3)Candidates在一个组中,可以有是用|分隔的多个候选表达式:varreg=/ILike(basketball|football|tabletennis)/console.log(reg.test('我喜欢篮球'));//trueconsole.log(reg.test('我喜欢足球'));//trueconsole.log(reg.test('我喜欢乒乓球'));//true(4)捕获和引用正则表达式匹配(捕获)的字符串将被暂存。其中,group捕获的字符串会从1开始编号,所以我们可以引用这些字符串:varreg=/(\d{4})-(\d{2})-(\d{2})/vardate='2021-08-29'reg.test(date)//在捕获之前测试/执行console.log(RegExp.$1);//2021console.log(RegExp.$2);//08console.log(RegExp.$3);//29$1指的是第一个捕获的字符串,$2是第二个,以此类推。(5)嵌套组的抓取如果遇到类似/((apple)is(a(fruit)))/这样的嵌套组,抓取的顺序是什么?varreg=/((apple)is(a(fruit))))/varstr="appleisafruit"reg.test(str)//trueRegExp.$1//appleisafruitRegExp.$2//appleRegExp.$3//一个水果RegExp.$4//fruit规则是按照左括号出现的顺序进行捕获(6)正则表达式中也可以引用引号,称为反向引用:varreg=/(\w{3})是\1/console.log(reg.test('kidiskid'));//trueconsole.log(reg.test('dikisdik'));//trueconsole.log(reg.test('kidiskid'));//falseconsole.log(reg.test('dikiskid'));//false\1指的是group捕获到的第一个字符串,换句话说,表达式是动态确定的。注意,如果数字越界,会被当作普通表达式处理varreg=/(\w{3})is\6/;reg.test('孩子是孩子');//falsereg.test('孩子是\6');//true9.String支持正则表达式(1)search()查找字符串中是否有匹配正则表达式的字符串,如果有则返回该字符串第一次出现的位置返回null,是否有正则中的全局匹配不会影响返回结果(2)match()匹配字符串中匹配正则表达式的字符串,返回字符串的数组,包括字符串内容,Location。如果正则设置为全局匹配,一次性返回所有满足正则表达式的字符串数组。如果添加了分组,则返回满足要求的字符串和一个分组的数组,但是如果同时启用了全局匹配,则不会在数组中添加分组内容varstr='helloworldhello';varreg1=/你好/;varreg2=/你好/g;varreg3=/(he)llo/;varreg4=/(he)llo/g;//匹配字符串中满足正则表达式的字符串,返回该字符串的数组,包括字符串内容、位置//['hello',index:0,input:'helloworldhello',groups:undefined]console.日志(str.match(reg1));//如果设置了全局匹配,则一次性返回所有匹配正则表达式的字符串数组//['hello','hello']console.日志(海峡匹配(reg2));//如果添加了组,则返回满足要求的字符串和组数组//[//'hello',//'he',//index:0,//input:'helloworldhello',//组:未定义//]console.log(str.match(reg3));//如果同时启用了全局匹配,则不会向数组中添加分组内容//['hello','hello']console.log(str.match(reg4));(3)split()//以某种形式拆分字符串split()varstr="terry134briup156lisi12zhangsan";//当数字出现一次或多次时varreg=/\d+/;varresult=str.split(reg);控制台日志(结果);//['特里','briup','lisi','zhangsan'](4)replace()//满足正则表达式条件的内容将被替换varstr='javascript'//如果启用全局模式,所有满足条件的字符将被替换被替换varreg=/javascript/;//replace(正则表达式,要替换的内容)varresult=str.replace(reg,'java');控制台日志(结果);//javaconsole.log(str);//javascriptlook-aheadexpressions在正则表达式中有一种叫做look-ahead的东西,有人称之为零宽度断言|(?=exp)|正面展望|匹配满足表达式exp|的位置|(?!exp)|否定前瞻|匹配不满足表达式exp|的位varstr='你好,你好,我是希拉里。';//后面必须匹配什么varreg=/H(?=i)/g;varnewStr=str.replace(reg,"T");console.log(newStr);//你好Ti,我是Tilary。在这个DEMO中我们可以看到positivelookahead的作用,也可以看到字符“H”,但是只匹配“H”后跟“i”就相当于有了公司reg。这时候很多“H”人员前来应聘,但是reg公司提出了一个必须掌握的硬性条件“i”就是这个技能,所以“你好”自然就被淘汰了。负前瞻呢?原因是一样的:varstr='Hello,Hi,IamHilary.';//不能匹配后面的内容varreg=/H(?!i)/g;varnewStr=str.replace(reg,"T");console.log(newStr);//特洛,你好,我是希拉里。在这个DEMO中,我们将之前的positivelookahead替换为negativelookahead。这个正则表达式意味着它匹配“H”并且后面不能跟“i”。这时候“你好”可以申请成功,因为reg公司修改了他们的招聘条件,他们说“i”的技术会破坏公司的企业文化,所以我们不要。