详解javascript 正则表达式之分组与前瞻匹配
本文主要讲解javascript的正则表达式中的分组匹配与前瞻匹配的,需要对正则的有基本认识,本人一直对两种匹配模棱不清。所以在这里总结一下,如有不对,还望大神指点。
1.分组匹配:
1.1捕获性分组匹配()
2.2非捕获性分组匹配(?:)
2前瞻匹配:
2.1正向前瞻匹配:(?=表达式)后面一定要匹配有什么
2.2反向前瞻匹配:(?!表达式)后面一定不能要有什么
1.1、捕获性分组匹配()
varstr1="holleword123456can12sa123a"; varreg1=/([a-z]+)\s(\d+)/;//不是全局模式,以()分组,这里有两组,每一组都将匹配得到 varregg1=/([a-z]+)\s(\d+)/g;//全局模式g,以()分组,这里有两组,每一组都将匹配得到 //res:非全局模式 console.log(reg1.exec(str1));//exec()方法:["wold123456","word","123456"] console.log(str1.match(reg1));//match()方法:["word123456","word","123456"] console.log(RegExp.$1);//获取到第一个分组([a-z]+)匹配的结果:word console.log(RegExp.$2);//获取到第一个分组(\d+)匹配的结果:123456 //res:全局模式 console.log(regg1.exec(str1));//exec()方法:["wold123456","word","123456"] console.log(str1.match(regg1));//match()方法:["word123456","can12","a123"] console.log(RegExp.$1);//获取到第一个分组([a-z]+)匹配的结果:a console.log(RegExp.$2);//获取到第一个分组(\d+)匹配的结果:123
分析:这个正则表达式匹配的是,至少一个字母,跟着一个空格,然后至少一个数字,
非全局就是第一次匹配正确就不会再往后匹配了,
1.exec()方法提取的值是规定的,第一个值是正则表达式相匹配的文本,如上示例的"/([a-z]+)\s(\d+)/",第2个值是第一个字子表达式(即第一个分组),如上示例的"([a-z])",以此类推
2.即使是全局模式,exec()都不会全局匹配,循环调用exec()是唯一全局匹配的方式,所以你会发现上面使用exec()方法的结果是一样
3.而match方法在全局模式的捕获性分组匹配,会对正则表达式全局匹配,但是不会对子表达式匹配(分组),所以你会发现上面str1.match(regg1)的结果是不会单独以分组([a-z]+)字母或者分组(\d+)数字出现,而是全局匹配整一个正则,所以结果是["word123456","can12","a123"]
4.match方法在非全局模式的捕获性分组匹配中,会对正则表达式全局匹配,也会对子表达式匹配(分组),所以你发现,str1.match(reg1)匹配的结果有单独分组的匹配,但是因为是非全局,所以第一次匹配正确就结束了,只有["wold123456","word","123456"],“wold123456”是整个表达式匹配的结果,“word”是第一个分组([a-z]+)匹配的结果,“123456”是第二分组(\d+)匹配的结果
5.$1,$2...分别包含正则表达式中的相对应反向引用,在全局与非全局模式,如果结果集有多个,会以最后一次匹配的结果来算,如上面,全局模式,匹配一共有三个符合的,["word123456","can12","a123"],那么就以最后一个"a123"为所有分组得到的结果,第一个分组是([a-z]+)匹配的是字母所以是a,第二个分组是数字(\d+),所以是123,以此类推,如果只出现一次,一次也是当最后一次,自然也是一样的分析,哈哈哈,有点多余。。。。
1.2(?:)非捕获性分组匹配,不捕获子表达式(分组)
varstr1="holleword123456can12sa123a"; varreg2=/(?:[a-z]+)\s(?:\d+)/; varregg2=/(?:[a-z]+)\s(?:\d+)/g; //res:非全局模式 console.log(reg2.exec(str1));//exec():直接匹配["wold123456"], console.log(str1.match(reg2));//match()方法:["word123456"] //res:全局模式 console.log(regg2.exec(str1));//exec():直接匹配["wold123456"], console.log(str1.match(regg2));//match()方法:["word123456","can12","a123"]
分析,和上面的捕获性分组匹配是一样的解析,只是不再匹配子表达式(分组)
2.1正向前瞻匹配:(?=表达式)后面一定要匹配有什么
注意:前瞻分组匹配(?=表达式)会作为匹配内容,不会作为匹配结果返回
//实例,提取以jpg类型的图片名称 varstr2="ab.jpg,admin/12.gif,and.jpg"; varreg3=/[^\\]\w+(?=\.jpg)/g; console.log(str2.match(reg3));//["ab",",and"]
2.2反向前瞻匹配:(?!表达式)后面一定不能要有什么
//示例:匹配连续a字母三个以上,且后面不能有数字 varstr3="aaa12345,aaaadmin,aaaaaadd,dlala"; varreg4=/a{3,}(?!\d+)/g; console.log(str3.match(reg4));//["aaaa","aaaaaa"]
总结
以上所述是小编给大家介绍的javascript正则表达式之分组与前瞻匹配,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!