day-17.4 正则表达式-量词
量词:在正则中某一个同样的规则重复出现的次数, 称为量词;
举例
1 var str = "123 4"; 2 var reg = /\d\d\d\d/; 3 var reg2 = /\d\d\d/; 4 var reg3 = /\d{3}/; 5 var reg4 = /\d\d/; 6 console.log(reg.test(str));//输出false;因为只有3个数字相连,这里表示的是相连,而不是总共有几个数字; 7 console.log(reg2.test(str)); //输出true; 8 console.log(reg3.test(str)); //输出true; 9 console.log(reg4.test(str));//输出true;有2个数字相连;
基础量词的写法:
{n} ; n个重复出现的规则;
{n,m} ;最少n个,最多m个,重复出现数量在n-m这个区间,也就是在n和m这个区间;
1 var str = "1234567890"; 2 var reg1 = /\d{2,4}/; //用以匹配的正则规则是满足2到4个之间的任何一个;这里可以说是都满足; 3 var reg2 = /\d{2,15}/;//用以匹配的正则规则是满足2到15个之间的任何一个;这里可以说是满足了2-10; 4 var reg3 = /\d{11,12}/;//用以匹配的规则是11-12;这里没有一个是满足的; 5 console.log(reg1.test(str)); //10个满足2到4个,所以是true; 6 console.log(reg2.test(str));//10个满足2到10个,所以是true; 7 console.log(reg3.test(str));//10个不满足11-12,所以是false;
这里也可以看出
规则变量.test(\d{n,m});这个函数,其实就是一个有正则规则为条件连续判断的函数,当有真时停止判断,返回真;
{n,} ; 最少n个,最大没有限制;
特殊量词的简写(这3个符号都为特殊字符,如果想要在代码中使用原符号,要加转义符):
{1,} + //最小一个,最大无限个
+号正则的写法:
1 <script> 2 var str = "12345abcd67890"; 3 var reg = /\d+/; 4 console.log(str.match(reg)); 5 </script>
{0,1} ? //要么0 ,要么1个;
{0,} * //要么0,要么匹配无限个(也就是有没有,都能匹配);
量词的特性:贪婪和惰性
量词默认具有贪婪属性,即
1 var str = "123123dafa1235"; 2 var reg1 = /\d{2,}/ ; 3 var reg2 = /\d{2,}?/;加个问好,表示惰性匹配; 4 console.log(str.match(reg1));//会输出123123这个数组,因为量词默认贪婪匹配; 5 console.log(str.match(reg2)) ; //会输出12这个数组,因为通过问号,将量词的特性修改为惰性,即最少匹配;
除了test的匹配方法之外还有match匹配,
不同于test匹配,match匹配有以下两个特点;
1、使用match这个函数的对象是源字符串变量,而不是正则规则变量;
2、match匹配返回的是按照正则规则从源字符串截取的数组;而不是bool值;
例如:
1 var str = "1234567890haha0987654321"; 2 var reg1 = /\d{1,3}/; 3 var reg2 = /\d{3}/; 4 var reg3 = /\d{3,}/; 5 var reg4 = /\d{4,5}/; 6 var reg5 = /\d{0,}/; //也可以写成 reg5 = /\d*/; 7 console.log(reg1.test(str));//输出true; 8 console.log(str.match(reg1));//输出一个内容为123的数组; 9 console.log(str.match(reg2));//输出一个内容为123的数组; 10 console.log(str.match(reg3));//输出一个内容为1234567890的数组; 11 console.log(str.match(reg4));//输出一个内容为12345的数组; 12 console.log(str.match(reg5));//输出一个内容为123457890的数组; 13 14 //可以看到一个特点,就是 源字符串变量.match(正则变量);截取的数组都是往规则的最大数量去截取,比如{1,3}截取3位,{4,5}截取5位,{3,}截取完一直到1234567890;