正则捕获

973 阅读2分钟

方括号的细节问题

  • 表示方括号中的部分特殊元字符中的任意一个 代表该字符的原义 除了\n之外
  • 不能识别多位数
  • 中括号范围[0-9][a-z][A-Z] 当需要一个数字的范围时 拆分字段

正则捕获

RegExp.prototype.exec()方法 ###正则捕获的懒惰性

  • 正则每次捕获的时候都是从索引 0 开始,捕获到第一个符合条件的就停止捕获 后面就不会捕获
  • 解决: 在后面加g

正则对象一个属性lastIndex属性

  • 记录下一次匹配或捕获起始位置 下一次再捕获或匹配时 就会从这个位置开始向后查找

match 方法配合正则 String.prototype.match()

match 使用的正则不加 g 时返回值和 exec 是一样的。但是如果有 g 时,match 方法会一次性把所有符合条件的都匹配到,而 exec 每次只能匹配到一个;

正则分组捕获 除了匹配还可以把符合条件的捕获到

捕获的返回值 ["大正则捕获到的","分组1捕获内容","分组2捕获内容"] match方法不能进行分组匹配

取消分组 (?:) 改变优先级 而不作分组捕获

小括号的细节问题

  • 分组捕获
  • 分组引用\数字 表引用前面分组某个分组的内容
  • 改变优先级

正则捕获的贪婪性

  • 如果正则匹配到符合规则的字符串,那么捕获的时候会按照最长的捕获
  • 解决 在量词元字符后面增加 ? 增加后 按照最少的匹配

正则的简单应用

  • 验证中国大陆手机号 以1 开头的11位数 let reg = /^1\d{10}$/
  • 验证某些号段的手机号验证 let /^(88|70|56)\d{8}$/
  • 匹配尾号连续的三个数字 let reg = /^1\d{7}(\d)(\1{2})$/
  • 靓号 let reg = /^1\d{2}(\d)\1{3}(\d)\2{3}$/
  • 有效数字的验证 let reg = /[1]?(\d|[1-9]\d+)(.\d+)?$/
  • 匹配中文姓名 中文的 Unicode 编码范围 \u4e00-\u9fa5 let reg = /[2]{2,6}$/
  • 邮箱验证 let reg = /[3]+@[a-zA-Z\d]+(.[a-z]+){1,2}$/
  • 数据类型检测
Object.isTypeOf = function (val) {
  let res = Object.prototype.toString.call(val); // "[object Xxxx]"
  let reg = /^\[object ([a-zA-Z]+)\]$/; // 在正则使用某些特殊元字符的原义时需要转义
  let exec = reg.exec(res)[1];
  return exec.toLowerCase();
};
console.log(Object.isTypeOf(1));

正向预查 (?=元字符) 不发生分组捕获 前面元字符后面必须是?=中元字符

负向捕获 (?!元字符) 不发生分组捕获 前面元字符后面不是是?!中元字符

正则的高级应用

  • 配合replace使用 String.prototype.replace(匹配内容,'替换内容')
  • 一次只能替换一个 一次全部提换掉 replace(正则,callback)
  • 格式化时间字符串
    • 获取时间字符串中所有时间数字 let reg = /\d+/g
    • 判断若数字小于10 前面补0 let add = arr.map(item=>+item<10 ? '0' + item : item)
    • 格式化时间
let tmpReg = /\{(\d)\}/g;
let result2 = tmp.replace(tmpReg, function ([, index]) {
  return ary[index];
});
  • url 查询参数格式化
let reg3 = /([^?=&]+)=([^?=&]+)/g;
url.replace(reg3, (str, key, value) => params[key] = value);
  • 获取数据类型 let reg = /^[object ([a-zA-Z]+)]$/

  1. +- ↩︎

  2. \u4d00-\u9fa5 ↩︎

  3. a-zA-Z\d ↩︎