• js之正则表达式(下)


    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));
  • 相关阅读:
    C++中虚继承的作用
    游戏程序设计学习初窥简单DirectX代码实现
    vue4.x更改默认端口 larry
    Visual studio 2010几个比较酷的功能
    Web前端编程:勿混淆NodeList与Array
    代码规范之署名
    一则中文文件名引起的问题
    C# WebService调用及数据并行处理
    2010年终总结
    关于DotNetNuke
  • 原文地址:https://www.cnblogs.com/xiaoxiaogogo/p/3580760.html
Copyright © 2020-2023  润新知