方括号的细节问题
- 表示方括号中的部分特殊元字符中的任意一个 代表该字符的原义 除了\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]+)]$/