正则就是我们定义的一个规则表达式(我们按一定的语法定义的规则)
正则表达式作用:用来匹配检测字符串
按照我们定义的规则,检测字符串是否合格
如何创建正则表达式
1. 字面量创建
var reg1 = /qwe/;
console.log( typeof reg1); // object
console.log(reg1);
2. 内置构造函数创建
var reg2 = new RegExp('qwe');
console.dir(reg2);
正则表达式是复杂数据类型(引用数据类型)
正则表达式是检测字符串是否符合规则的
.test(参数) 参数我们要检测的字符串
语法:正则.test(你要检测的字符串);
返回值:布尔值,检测合格返回true 否则返回false
var reg = /qwe/; // 字符串中是否有qwe字符串
var str = '1q23w34e56';
var res = reg.test(str);
console.log(res); // false
console.log(/qwer/.test('123qqqwert123')); // true
正则表达式是由文本和一些具有特殊含义的字符组成的
元字符
1. \d 表示数字(0-9)
var reg = /\d/; // 看字符串中是否有数字
console.log(reg.test('qwert')); // false
console.log(reg.test('qwert0')); // true
console.log(reg.test('')); // false
console.log(reg.test('1234456')); // true
2. \D 表示非数字
console.log(/\D/.test('1234567'));// false
console.log(/\D/.test('12345670o'));// true
3. \s 表示空白字符
console.log(/\s/.test('0')); // false
console.log(/\s/.test('')); // false
console.log(/\s/.test(' ')); // true
console.log(/\s/.test('12345 6')); // true
console.log(/\s/.test()); // false
4. \S 表示非空白字符
console.log(/\S/.test(''));// false
console.log(/\S/.test());// true
console.log(/\S/.test(' ')); // false
console.log(/\S/.test('1 1')); // true
5. \w 数字字母下划线
console.log(/\w/.test('!@#$-')); // false
console.log(/\w/.test('amdin123')); // true
6. \W 非数字字母下划线
console.log(/\W/.test('1234567'));// false
console.log(/\W/.test('qwert')); // false
console.log(/\W/.test('_1_2_')); // false
console.log(/\W/.test('!@#$-'));// true
console.log(/\W/.test('!@#12334$-'));// true
7. 点 . 表示非换行的字符
console.log(/./.test('\n')); // false
console.log(/./.test(' ')); // true
console.log(/./.test('q24'));// true
元字符:
\d 数字
\D 非数字
\s 空白符
\S 非空白符
\w 数字字母下划线
\W 非数字字母下划线
. 非换行字符
限定符,帮我们限定出现的次数
1. * 0到无数次
console.log(/\d*/.test('1234')); // true
console.log(/\d*/.test('qwert'));// true
2. + 1次到无数次
console.log(/\d+/.test('1234')); // true
console.log(/\d+/.test('qwert'));// false
3. ? 只要0次或1次就可以
console.log(/\d?/.test('1234')); // true
console.log(/\d?/.test('qwert')); // true
4. {n} 只要出现连续n次就可以
console.log(/\d{2}/.test('1234')); // true
console.log(/\d{2}/.test('1qwer1')); // false
5. {n,m} 只要出现连续的n到m次
console.log(/\d{2,4}/.test('123')); // true
console.log(/\d{2,4}/.test('1234')); // true
console.log(/\d{2,4}/.test('12345'));// true
console.log(/\d{2,4}/.test('1q2w3e4r')); // false
6. {n,} 只要连续的出现n次到无数次
console.log(/\d{3,}/.test('12')); // false
console.log(/\d{3,}/.test('1234')); // true
console.log(/\d{3,}/.test('12345'));// true
console.log(/\d{3,}/.test('1q2w3e4r')); // false
限定符
* 0~无数次 {0,}
+ 1~无数次 {1,}
? 0或1次 {0,1}
{n} 连续出现n次
{n,m} 连续出现n次到m次
{n,} 连续出现n次到无数次
边界符,限定开头和结尾
^ 表示开头
$ 表示结尾
// 特殊符号
1. \ 转义
会将普通的字符,转为有特殊含义的字符
w普通的字符--------> \w 数字字母下划线
会将具有特殊含义的字符,转为普通的字符
. 非换行的字符------> \. 仅仅表示点这个字符,没有特殊函数
2. - 范围
0-9 表示0到9的数字,a-z 表示所有的小写字母 A-Z 表示所有的大写字母
3. [] 表示一个字符集合,只要[]中字符集合的一个匹配就行
console.log(/^[1234]/.test('12432')); // true
console.log(/^[1234]/.test('4567www')); // true
console.log(/^[1234]/.test('567www')); // false
4. () 表示一个字符组,把小括号中的看做一个整体
console.log(/^(1234)/.test('123432')); // true
console.log(/^(1234)/.test('1235www')); // false
console.log(/^(1234)/.test('2345www')); // false
5. | 或者
console.log(/^[12|34|56]/.test('123456')) // true
console.log(/^[12|34|56]/.test('12w3456')) // true
console.log(/^[12|34|56]/.test('w3456')) // false
console.log(/^[12|34|56]/.test('322456'))// true
console.log(/^(12|34|56)/.test('123456')); // true
console.log(/^(12|34|56)/.test('1323456')); // false
console.log(/^(12|34|56)/.test('23456')); // false
console.log(/(12|34|56)$/.test('34w56')); // true
console.log(/(12|34|56)$/.test('234w56')); // false
6. [^] 表示除了[^ ]中的字符不匹配,别的都可以匹配
console.log(/[^1234]/.test('1qwee')); // true
console.log(/[^1234]/.test('qwee')); //true
console.log(/[^1234]/.test('qwee1234')); // true
console.log(/[^1234]/.test('1234')); // false
console.log(/^[^1234]/.test('1qwee')); // false
标识符,放在正则表达式的最后面
i 表示忽略大小的匹配
g 表示全局匹配
var reg1 = /[a-z]/ig;
var reg2 = new RegExp('[a-z]','ig');
console.log(reg1,reg2);
console.log(/^[a-z]$/.test('qwee')); // false
console.log(/^[a-z]/.test('ASD')); // false
console.log(/^[a-z]/i.test('ASD')); // true
console.log(/[a-z]/ig.test('ASD')); // true
exec() 方法
正则.exec(参数) 参数就是要检测的字符串
返回值,返回第一个匹配到的字符串的数组,如果匹配不到返回null
var reg = /\d{2}/g;
var str = '12w34e56';
var str = '1wwww2www';
console.log(reg.exec(str));
如果正则表达式中使用g的标识符,则表示全局匹配
每匹配完一次,下次匹配就在上一次匹配结束之后的基础上匹配
var arr1 = reg.exec(str);
console.log(arr1[0]);
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
先定义一个空数组来接受匹配到的字符串
var arr = [];
var strArr; // 每次匹配到的字符串数组
while(strArr = reg.exec(str)){
将匹配到的字符串放到数组中
arr.push(strArr[0]);
}
console.log(arr);
console.log(Boolean([12432])); // true
console.log(Boolean([])); // true
js中转为布尔值为false的数据 0 '' NaN undefined null 其他的都为true
1. replace(正则表达式,要替换为什么内容) 匹配正则,然后替换
var str = '无论多大麻烦,黑夜总会过去';
console.log(str.replace(/(大麻|夜总会)/g,'*'));
2. search(正则) 匹配到字符串中是否有合格的然后索引,匹配不到返回-1
var str = '12w34w56e';
var reg = /\d{2}/
var res = str.search(reg);
console.log(res);
3. match(正则) 返回匹配到的字符串的数组,如果是全局匹配,匹配到多个返回数组
如果匹配不到返回空null
var time = '今天的日期是2021-08-25';
var reg = /\d{2,4}/g;
var res = time.match(reg);
console.log(res); // ["2021", "08", "25"]
正则匹配字符串,会尽量的按多个次数匹配,拿到结果
// 需求:用户名要求是 6到12位字母数字下划线组成
/^\w{6,12}$/
qq号 5位11位数字 第一位不为0
/^[1-9]\d{4,10}$/
console.log(/^[1-9]\d{4,10}$/.test('01234567'));
邮箱
非_$开头,任意字符出现至少6次,一个@符号,(163|126|qq|sina)中的任意一个,一个点,(com|cn|net)中的任意一个
admin123@163.com
admin123@qq.com
/^[^_$]\w{5,}@(163|126|qq|sina)\.(com|cn|net)$/
/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/
中文匹配
console.log(/[\u4e00-\u9fa5]/.test('中文')); // true