js的再学习(四)

我与影子孤独终老i 提交于 2020-01-11 05:36:35

js正则表达式(regular expression :RegExp)

正则的作用和使用方法

  • 用来处理字符串的规则
    • 只能处理字符串
    • 它是一个规则:可以验证(text方法)字符串是否符合某个规则,也可以把字符串中符合规则的内容捕获(exec方法)
  • 使用方法
    var reg = new RegExp()
    reg = /\d+/  // 这就是一个正则表达式
    
  • 创建正则的两种方式以及区别
    • 通过字面量方式(两个斜杠包裹的用来描述正则规则的元字符就是正则)
    let reg = /\d+/
    
    • 通过构造函数创建正则,它有两个参数:元字符字符串,修饰符字符串,
    let reg2 = new RegExp("\\d+")
    
  • 他们之间的区别
    • 用构造函数创建的正则中 元字符中的\需要转义
    • 用构造函数创建的正则中,可以存在变量
      	var type = 'aaaa'
      	reg = /^@+type+@$/  // 这里面的type不是一个变量
      	new RegExp('^@'+type+'@$')  // 这里面的type就是变量type的值’aaaa‘
      

正则中的方法

  • RegExp 对象是带有预定义属性和方法的正则表达式对象
    • test() 它通过模式来搜索字符串,然后根据结果返回 true 或 false。
      var str = 'hello word'
      var reg = new RegExp()
      reg = /\d+/
      console.log(reg.test(str));
      
    • exec() 它通过指定的模式(pattern)搜索字符串,并返回已找到的文本。如果未找到匹配,则返回 null。
      var reg = new RegExp()
      reg = /\d+/
      reg.exec('dffsd1')  // ["1", index: 5, input: "dffsd1", groups: undefined]
      // 返回值是一个数组,数组中包括找打内容的索引,以及原始字符串
      

正则表达式的两部分

元字符

  • 如果字符串中有\的话 需要转义一下,因为字符串中的\默认就是转义字符
    let reg = /2.3/
    
  • 量词元字符
    • +一到多次
    • * 零到多次
    • ?零次和一次
    • {n} 出现n次
    • {n,} 出现n到多次
    • {n,m} 出现n到m次
  • 特殊元字符
    • \ 转义字符(普通-特殊-普通)
    • . 除\n以外的任意字符
    • ^以哪一个元字符作为开始
  • 组合元字符
    • \n 除换行符以外的任意字符
    • \d 0~9之间的任意一个数字
    • \D 非0~9之间的数字
    • \w 数字字母下划线中的任意一个字符
    • \W 非数字字母下划线中的任意一个字符
    • \s 一个空白字符(包括空格,制表符【一个tab键】,换页符)
    • \t 一个制表符
    • \d 匹配一个单词的边界
    • x|y x或者y中的字符
    • [xyz] xyz三个中的任一个字符
    • [^xy] 非x或者y中的字符
    • [a-z0-9A-Z_] 代表数字字母下划线中的任一个字符 等于/w
    • () 正则中的分组符号
    • (?:) 只匹配不捕获
    • (?=) 正向预查
    • (?!) 反向预查

修饰符

  • i 忽略单词大小写匹配
  • m 进行多行匹配
  • g 全局匹配

使用正则元字符时会出现的一下问题

  • 使用y|x出现的问题
    // x|y会存在一个优先级问题
    reg = /^18|19/ 
    reg.test('18')  // true 
    reg.text('19') // true
    reg.text('181') // true
    reg.text('1219') // true
    reg1 = /^(18|19)/  
    reg1.test('18')  // true 
    reg1.text('19') // true
    reg1.text('181') // false
    reg1.text('1219') // fase
    
  • 使用[],中括号中出现的字符一般都代表本身的含义,但又有些意外
    reg = /^[@+]$/ // 这里的[@+]代码字符@和字符+的任意一个
    reg = /^[\d]$/ // 这里的[\d] 代表的就是0-9之间的任意一个数字
    reg = /^[10-29]/  // 代表的是1或0-2或9 并不是10-29之间的一个数字
    

常用的正则表达式

  • 验证是否是有效数字
    // 可能会出现+ - 号 [+-]?
    // 一位数字首位可能为0 ,多位数字首位不能为0  (\d|([1-9]\d+))
    // 小数部分 (\.\d+)?
    let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
    
  • 验证密码
    // 数字字母下划线 6~16位
    let reg = /^\w{6,16}$/
    
  • 验证真实姓名
    // 汉字的正则表达式  /^[u4e00-u9FA5]$/
    // 汉字长度2-10
    // 可能存在有   名字·名字的类型(音译名)
    let reg = /^[u4e00-u9FA5]{2,10}(.[u4e00-u9FA5]{2,10}){0,2}$/
    
  • 验证邮箱的正则表达式
    let reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/
    
  • 身份证号码的正则表达式
    • ()分组捕获,并且可以单独获得每个分组的内容
    let  reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/
    reg.exec('412723199412351241')
    // 得到的就是一个数组["412723199412351241", "412723", "1994", "12", "35", "4", "1", index: 0, input: "412723199412351241", groups: undefined]
    

正则的捕获(以及分组捕获)

  • 实现正则捕获的前提是:当前正则要和字符串匹配,如果不匹配捕获的话那就返回null
  • 基于exec()这个方法实现正则的捕获,返回的结果是一个null或者是一个数组
    • 数组中的第一个内容就是捕获到的内容
    • 如果有分组()的话,后几项就是分组捕获的内容
    • 然后数索项,返回捕获的整体整容的索引
    • 然后是我们操作的字符串
    reg = /(\d)(\d)(\d)/  //分组捕获’
    reg.exec('123')
    // 上面分组捕获得到的数组 ["123", "1", "2", "3", index: 0, input: "123", groups: undefined]
    
  • 每执行一次exec()只能捕获到一个符合正则规则的,就是执行100遍也只捕获第一个,这就是正则捕获的懒惰性(解决办法用全局修饰符g)
    //懒惰性解释
    var str = 'a12a21a'
    reg = /a/
    reg.exec(str) // 如果我们需要捕获str中的所有a,那么我们使用exec进行捕获的时候,只能拿到第一次捕获的
    // 正则有一个索引为lastIndex:当前正则下一次匹配的起始索引位置,而产生懒惰性的原				 
    //因就是lastIndex永远不会自动改变,它默认一直都是0就是说他无论执行多少次,他都是
    //从索引0开始捕获
    // 但是如果我们给正则使用修饰符g的时候。可以改变lastIndex的值
    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!