一、正则介绍
- 正则:一种处理字符串的规则
- 处理:匹配 捕获
匹配:有一段正则和字符串,匹配的意思是为了看这个字符串是否符合这个正则定义的规则。
捕获:有一段正则和字符串,捕获的意思是把这个字符串中符合这个规则的部分捕获到 - 写法:/元字符/
var reg = /1/; // 字面量 /元字符/ 定义了一个规则:字符串中得有1
var reg2 = new RegExp('1'); //构造函数:
reg.test("afaffaawa"); //匹配用到的函数test
var reg3 = /\d/;
- 元字符
特殊元字符:- \ 作用:转义
- \d 作用:数字
- \D 作用:除数字以为的其他字符
- \w 作用:数字、字母或下划线
- \W 作用:数字、字母或下划线以外的其它字符
- ^ 作用:以字符后边的一位开头,若写就得写在正则的最前边
- $ 作用:以字符前边的一位结尾,若写就得写在正则的最后边 中括号:
- [xyz] 作用:中括号中元素之间或的关系,返回值只有一位(表示只要包含中括号中任意一位元素即可)
- [^ab] 作用:代表除了ab以外的字符(^在这里表示取反的意思)
- [a-z] 作用:代表一位小写字母即可
- [A-Z] 作用:代表一位大写字母即可
- [a-zA-Z] 作用:代表大小写字母任意一位即可
- a|b 作用:a或者b中的一位
- . 作用:表示除了换行以外的其他字符(中括号中的点代表点本身)
- () 作用:提升优先级 分组(捕获时候的概念)
小问题:
/^11|22/ 代表11或者12
修饰符:
- g global 全局匹配,最多用于捕获,匹配时很少用
- i ignoreCase 忽略大小写
- m multiline 多行匹配 量词元字符: (量:数量)用在要修饰的字符的后边
- ? /\d?/ 作用:代表前边的字符出现0或者1次
-
- 作用:表示前边的字符出现1到多次
-
- 作用:表示前边的字符出现0到多次
- {n} 作用:表示前边的字符出现n次
- {n,} 作用:表示前边的字符出现n到多次
- {n,m} 作用:表示前边的字符出现n到m次
var str = "你好"珠峰"" //字符串中的转义,就是把字符串中有特殊含义的字符 转成字符本身(不代表任何含义)
box.innerHTML = `\d在正则中表示数字的意思`
box.innerHTML = `\\d`
var reg4 = /\d/ //定义了一个规则:字符串中得有数字
var reg5 = /^1/ //规则就是 字符串必须得是1开头的
var reg6 = /1$/ //规则就是 字符串必须得是1结尾的
var reg7 = /21$/ //规则就是 字符串必须得是1结尾的 && ‘这个’1前边必须是2
var reg8 = /^21$/ //规则就是 字符串必须得是2开头1结尾 && 这个1前边必须是这个2
var reg9 = /^1$/ //规则就是 字符串必须得是这个1结尾的&& 必须是这个1开头
var reg10 = / 2 1$/ //规则就是 字符串必须得是这个1结尾的 && 这个1前边必须是空格 这个空格前边必须是2 这个2前边必须是
var reg11 = / 2 ?1$/ //规则就是 字符串必须得是这个1结尾的 && 这个1前边空格出现一次或者0次 这个空格前边必须是2 这个2前边必须是 空格
1、匹配
- 代码:reg.test(字符串)
- 一般考察:手机号、身份证号、邮箱、强弱密码
【练习】
let reg = /^1[3-9]\d{9}$/;
let reg1 = /^(156|189|182|131|132)\d{8}$/;
btn.onclick = (function(){
if(reg1.test(inp.value)){ //inp.value 获取运算值
alert('点击获取验证码');
}else{
alert('请输入正确的手机号');
}
});
let reg2 = /^[1-9]\d{4,10}@qq.com$/;
btn1.onclick = (function(){
if(reg2.test(inp2.value)){ //inp.value 获取运算值
alert('点击获取验证码');
}else{
alert('请输入正确的邮箱号');
}
});
let reg3 = /^\d{17}(\d|X)$/;
let reg4 = /^(1[8-9])|([2-5]\d)|(6[0-5])$/;
btn2.onclick = (function(){
if(reg3.test(inp3.value)){ //inp.value 获取运算值
alert('点击获取验证码');
}else{
alert('请输入正确的身份证号');
}
});
btn3.onclick = (function(){
if(reg4.test(inp4.value)){ //inp.value 获取运算值
alert('点击获取年龄');
}else{
alert('请输入正确的年龄');
}
});
//思路:
//+-可有可无 有的话一定是在前边
//小数部分可有可无,有的话一定在后边
//单个整数可以是0,多位数不能是0开头
//多少位不限制
let reg5 = /^[+-]?(\d|[1-9]\d+)(.\d+)?$/;
btn4.onclick = (function(){
if(reg5.test(inp5.value)){ //inp.value 获取运算值
alert('点击获取有效数字');
}else{
alert('请输入正确的有效数字');
}
});
//密码只能是由字母 数字 _ . + - @ $ 组成的8到15位字符
let reg6 = /^[\w.+-@$]{8-15}$/;//弱校验
//密码必须包含大小写、数字、字母、(_.-+@$)组成的8-15位
let reg7 = /^(?=.*[A-Z]).{8,15}$/; //强校验
//正向预查
2、捕获
特性:
- 贪婪性:一次性获取,会尽可能多的去获取内容。
解决方法:就在量词后边加一个? - 懒惰性:只取连续性的一段,不会继续往后取。
解决方法:采用修饰符g
注意: 使用g全局捕获的时候会循环着返回捕获值的原因是:全局中的reg有个lastIndex属性,代表执行时开始位置(索引) test/exec通用
//捕获
var str = '珠峰2009珠峰2022';
var reg = /\d+/g
RegExp.prototype.execAll = function (str) {
if (!this.global) { //防止没加g陷入死循环中
throw new Error('没加G')
}
this.lastIndex = 0; //防止这个正则的lastIndex不是0而导致获取到的内容不对
let ary = [];
let res = this.exec(str);
while (res) {
ary.push(res[0])
res = this.exec(str)
}
return ary
}
console.log(reg.execAll(str));
let reg1 = /(feng)(\d+)/
let reg2 = /feng\d+/
let str1 = 'zhufeng1002珠峰2022'
console.log(reg1.exec(str1))
console.log(reg2.exec(str1))