1、分组之exec返回数组
1》非分组匹配的exec返回数组:
1 var pattern =/\d+[a-z]+/; 2 var str='234google'; 3 alert(pattern.exec(str)); //234google 4 alert(typeof pattern.exec(str)); //object
2》分组匹配下的exec返回数组
1 pattern =/(\d+)([a-z]*)/; 2 var a =pattern.exec(str); 3 alert(a); //234google,234,google 4 alert(a.length); //3 5 alert(a[0]); //234google :返回 匹配到的总的字符串 6 alert(a[1]); //234 :返回 匹配到的 第一个分组的字符串 7 alert(a[2]); //google :返回 匹配到的第二个分组的字符串
3》捕获分组和不捕获分组
上面第二种的 分组 匹配下的exec()就是 捕获分组。
不捕获分组,就是在不想捕获的分组匹配字符串前面 加上‘?:’,那么在匹配的时候就不会捕获这个模式字符串
1 //下面是捕获分组 2 var pattern =/(\d+)\s([a-z]+)/; 3 var str='123 abc'; 4 var a=pattern.exec(str); 5 alert(a); //123 abc,123,abc 6 7 8 //不捕获分组 9 var pattern2=/(\d+)\s(?:[a-z]+)/; //在分组前面加上 "?:" 表示这个分组 在匹配的时候 不捕获 10 var str='123 abc'; 11 var a=pattern2.exec(str); 12 alert(a); //123 abc,123 :注意:abc 这个 分组没有被捕获 13 alert(a.length); //2
4》分组嵌套的捕获
对应嵌套分组的模式字符串,在捕获的时候是“从外向内”进行捕获的。
1 var pattern =/(a?(b?(c?)))/; 2 var str='abc'; 3 var a =pattern.exec(str); // 分组嵌套匹配 的获取是 “从外向内” 进行捕获的 4 alert(a[0]); //abc 返回:匹配到的 总 字符串 5 alert(a[1]); //abc 返回:返回第一个分组 的匹配 字符串(从外向内) 6 alert(a[2]); //bc 返回:第二个分组 匹配到的字符串 7 alert(a[3]); //c 返回:返回第三个分组匹配到的 字符串
2、前瞻捕获
匹配字符串的时候只匹配,符合自己要求的字符串,捕获也是同样的
先看示例:
1 var pattern =/goo/; 2 var str='goobb'; 3 alert(pattern.exec(str)); //返回 goo
如果只想要,goo后面的 是gle的 时候才匹配成功和 捕获,就要使用前瞻捕获进行限制
1 pattern=/goo(?=gle)/; //前瞻匹配:要求 goo 后面必须是 gle 才能匹配上 2 var str='goobb'; 3 alert(pattern.exec(str)); //null 4 alert(pattern.test('google'));//true 5 alert(pattern.exec('google')); //goo
3、正则表达式中特殊字符的匹配
如果 匹配字符串中 含有 正则表达式中 特殊字符串,那么就 要用 \ 进行转义 之后才能使用,否则会报错
1 var pattern =/\./; 2 var str='.'; 3 alert(pattern.test(str));//true
4、常用正则表达式练习
写正则表达式的时候,最好先把测试的示例,然后总结出需求,然后再写正则表达式
1》邮编的验证
先写出一个示例:
var str='This is 124000!'; //由此可知要求是:6位字符, 要求都是数字 ,第一 字符大于 0
1 var pattern =/[1-9][0-9]{5}/; //如果想要 除了 邮政编码 什么都不需要,就 可以 加上 行首和行尾 匹配 '^$' 2 var str='This is 124000!'; //由此可知要求是:6位字符, 要求都是数字 ,第一 字符大于 0 3 alert(pattern.test(str)); //true
2》 压缩包 的匹配
示例:
var str='12_3.rar'; //要求:文件名:字母、数字、_,,然后是 . ,,最后是 zip或者 rar
1 var pattern =/^(\w+)\.(zip|rar|7z|gz)$/; //限定 行首和行尾 匹配 2 var str='12_3.rar'; //要求:文件名:字母、数字、_,,然后是 . ,,最后是 zip或者 rar 3 4 alert(pattern.test(str));
3》 删除多余的 空格
删除字符串中所有的空格,这个很简单
var pattern =/\s/g; var str='aa bbb cccc dd'; alert(str.replace(pattern,''));
删除首尾的空格
1)最简单、最shit的写法
1 var pattern =/^\s+/; 2 var str=' goo gle '; 3 var result =str.replace(pattern,''); 4 pattern =/\s+$/; 5 result =result.replace(pattern,''); 6 alert('|' +result + '|');
2)使用惰性模式的捕获
1 var pattern =/^\s+(.*?)\s+$/; //加上 ? 使用惰性模式,(因为贪婪模式:会将 后面的空格也匹配到 分组的模式字符串 里面),,所以在先 匹配首位之后,,再匹配 分组中的时候 不在 匹配 行尾匹配到的字符串 2 var str=' goo gle '; 3 //使用 exec()的 捕获 4 var result =pattern.exec(str)[1]; 5 alert('|' + result + '|');
3)使用分组获取
1 var pattern =/^\s+(.*?)\s+$/; 2 var str=' goo gle '; 3 var result =str.replace(pattern,'$1'); //取到 分组 匹配的 字符串然后 替代字符串 4 alert('|' + result + '|');
4》简单单子邮箱的验证
示例:
var str='gg60.shit@gmail.com'; //格式:'用户名(字母、数字、 .
1 var pattern =/^([\w\.\-]+)@([\w\-]+)\.([a-zA-Z]{2,4})$/; 2 var str='gg60.shit@gmail.com'; //格式:'用户名(字母、数字、 . 、-、_)@域名(字母、数字、-).com/cn等(字母(2-4位))' 3 alert(pattern.test(str));