千变万化的正则表达式

222 阅读2分钟

正则表达式

  1. 定义

    • 用于匹配规律规则的表达式,是对字符串的一种逻辑公式,就是用事先定义好的一些特定的字符,及这些特定字符的组合,组成一个'规则字符串',这个'规则字符串'用来表达对字符串的一种过滤.
  2. 作用

    1. 给定的字符串是否符合正则表达式的过滤逻辑(匹配).
    2. 可以通过正则表达式,从字符串中获取我们想要的特定部分(提取).
    3. 强大的字符串替换能力(替换).
  3. 特点

    1. 灵活性,逻辑性和功能性非常的强.
    2. 可以迅速地用极简单的方式达到字符串的复杂控制.
    3. 对于刚接触的人来说,就有点难搞了,主要就是难以记住.
  4. 组成

    1. 普通字符 abc 123
    2. 特殊字符(元字符):正则表达式中有特殊意义的字符 \d \w
  5. 常用元字符

    1. \d 匹配一个数字
    2. \D 匹配非数字一个
    3. \w 匹配字母或数字或下划线 即[a-zA-Z_0-9]
    4. \W 匹配除了字母,数字,下划线以外的内容
    5. \s 匹空格与换行
    6. \S 匹除了空格与换行以外的内容(非空白字符)
    7. . 匹匹任意的单个字符除了换行
    8. ^ 匹行首的文本(以谁开始) ^ab\w\d
    9. $ 匹行尾的文本(以谁结束) ab\w\d\$
  6. 限定符

    1. * 重复零次或更多次
    2. + 重复一次或更多次
    3. ? 重复零次或一次
    4. {n} 重复n次 例 ^\d{6}$
    5. {n,} 重复n次或更多次
    6. {n,m} 重复n到m次
  7. 其他

    1. [] 字符串常用中括号括起来 表示匹配其中的任一字符,相当于或的意思
    2. [^] 匹配除中括号以内的内容 ^在中括号里面相当于取反中括号里面的内容
    3. \ 转义符
    4. | 或者,选择两者中的一个. 注意: | 将左右分为两部分,而不管左右两边有多长多乱 一般要用括号括起来
    5. () 从两个直接量中选择一个,分组 例 gr(a|e)y匹配gray和grey
    6. [\u4e00-\u9fa5] 匹配汉字
  8. 示例

    • 验证邮箱(第一位不能是0) 100010 --->
      ^[1-9]{6}$这个不对
      ^[1-9]\d{5}&
      
    • 验证手机号 15811111111
      ^[1-9]\d{10}$
      
    • 验证日期 2020-05-01
      //简单的匹配格式 暂时不考虑具体不正确与否
      ^\d{4}-\d{1,2}-\d{1,2}$
      
    • 验证邮箱 xxx@qq.com xxx@sina.com.cn
      ^\w+@\w+\.\w+&
      ^\w+@\w+(\.\w+)+
      ^\w+([-+.]\w)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
      
    • 验证IP地址 192.168.1.10
  9. 正则对象

    1. 内置对象 RegExp
    2. 第一个参数 模式pattern 字符串类型
    3. 第二个参数 flag i忽略大小写 g全局匹配 字符串
  10. 使用方式

    1. 方式1
      var regularExpression = new RegExp('ab[a-z]','i');
      var str = "xyz";
      console.log(regularExpression.test(str)
      
    2. 方式2
    var reg = /ab[a-z]/;//默认不忽略大小写
    var str = 'aBd';
    console.log(reg.test(str))
    var reg = /ab[a-z]/i; //忽略大小写
    
  11. 正则对象的方法

    1. test (匹配)
    2. exec (提取)
      • 只返回一个匹配的结果
      • 如果没有匹配内容返回null
      • 加上g全局匹配后,执行一次结果往后走一步
      • 如果要取所有的比较麻烦,需要自己去循环执行多次exec实现
      var str = 'merry:2500,李四:3000,王五:5000';
      var reg = /\d+/;
      var reg1 = /\d+/gi; //gi 全局匹配并忽略大小写
      var res1 = reg.exec(str)//["2500", index: 6, input: "merry:2500,李四:3000,王五:5000", groups: undefined]
      var res2 = reg.exec(str)//["2500", index: 6, input: "merry:2500,李四:3000,王五:5000", groups: undefined]
      var res3 = reg1.exec(str)//["2500", index: 6, input: "merry:2500,李四:3000,王五:5000", groups: undefined]
      var res4 = reg1.exec(str)//["3000", index: 14, input: "merry:2500,李四:3000,王五:5000", groups: undefined]
      do{
          var res = reg1.exec(str);
          //结束的时候返回的是null
          if(res){
              console.log(res[0])
          }
      //}while(res != null)
      }while(res)
      
  12. String对象的方法

    1. match 可以提取多个内容
      var str = 'merry:2500,李四:3000,王五:5000';
      var reg = /\d+/;
      var reg1 = /\d+/g;
      var res = str.match(reg);
      var res1 = str.match(reg1);
      
      //提取email地址
      var str = '123@xx.com,fang@vaue.cn,还好我请求 85527676@qq.com,2.emaillisi@emaillength.english.com 687687@qq.com';
      var reg = /\w+@\w+(\.\w+)+/g;
      console.log(str.match(reg))
      
    2. replace 替换
      //替换所有的空白
      var str = "   123AD asadf     asagsagsg  sh";
      str.trim() //去掉首位的空格
      //只能替换掉第一个查找到的内容
      str.replace(" ",'x') 
      var reg = /\s/g;
      str.replace(reg,'') //123ADasadfasagsagsgsh
      
      str.split(" ").join("") //123ADasadfasagsagsgsh
      
      //把所有的,和,替换为.
      var str = 'abc,yhb,123,asd,hh7,aas';
      var reg = /[,,]/g;
      var reg1 = /,|,/g;
      str.replace(reg,'.') //"abc.yhb.123.asd.hh7.aas"
      
      
    3. split 切割
      //提取日期中的年部分 2016-5-10
      var dateStr = '2016-5-10';
      var reg = /(\d{4})-(\d{1,2})-(\d{1,2})/;
      dateStr.split(reg) //["", "2016", "5", "10", ""]
      var reg1 = /\d{4}-\d{1,2}-\d{1,2}/;
      dateStr.split(reg1) //["", ""]
      //如果正则表达式包含子表达式,那么返回的数组中包括与这些子表达式匹配的字串.
      
    4. search 检索查找 str.search(regexp)
      • 此方法用于搜索字符串中指定的子字符串
      • 如果有,则返回子字符串在字符串中的位置(子字符串第一个字符在字符串中的位置)
      • 如果没有,则返回-1
      var str="我的的url地址是www.2222.com";
      var reg=/\w+/g 
      console.log(str.search(reg)); //3
      
  13. 分组提取

    //提取日期中的年部分 2016-5-10
    var dateStr = '2016-5-10';
    var reg = /(\d{4})-(\d{1,2})-(\d{1,2})/;
    reg.test(dateStr);
    reg.exec(dateStr)
    dateStr.match(reg)
    只要执行一次正则的方法
    RegExp.$1 -> 2016
    RegExp.$2 -> 5
    RegExp.$3 -> 10
    
    //提取邮件中的每一部分
    var str1 = 'xxxx@itedc.com';
    var reg1 = /(\w+)@(\w+)\.(\w+)/
    reg1.test(str1);
    RegExp.$1 -> xxxx
    RegExp.$2 -> itedc
    RegExp.$3 -> com
    
  14. 贪婪模式和非贪婪模式

    • 贪婪模式也是正则表达式的默认匹配方式
    • JS中的正则表达式的贪婪模式和非贪婪模式主要是匹配方式上有所不同
    • 正则中的?可以使正则式采用非贪婪模式进行匹配
  15. onchange事件 文本改变并且失去焦点的时候发生而不仅仅是文本发生改变就触发

总结

正则表达式,这个知识点,学习了好多次,以前总是想着学会所有的东西,难点在于牢记元字符以及限定符的准确含义,其实,我们只要记住常用的就好了,至于那些比较难的不常用的我们可以真的需要的时候再去查看笔记.加油,喜欢的可以给个赞,吐槽也行哈,谢谢了.