正则就是一种规则,用来服务“字符串”的一种规则,有匹配和捕获两种作用
1、匹配:验证当前字符串是否符合我设定的规则
let reg=/^\d$/;//规则是0-9之间的数字,1到多位
console.log(reg.test('123'));//true
console.log(reg.test('123px'));//false
-------------------------------------------------------
let reg=/\d+/;//规则是只要包含0-9之间,1到多位数字就行
console.log(reg.test('123px'));;//true
console.log('zhangtao');//false
2、捕获:把字符串中符合规则的部分捕获到
let reg=/\d+/;//规则是只要包含0-9之间,1到多位数字就行
console.log(reg.exec('123px'));//看一下这个字符串中符合规则的捕获出来,结果是以下数组,没有捕获到匹配的就是null
//["123", index: 0, input: "123px", groups: undefined]
0: "123"——————数组第一项是捕获到的符合规则的内容
groups: undefined
index: 0————捕获到的开始索引
input: "123px"————原始字符串
length: 1
3、正则的组成
1、元字符(不可省略)
①量词元字符
? 0到1次
* 0到多次
+ 1到多次
{n} 出现n次
{n,} 至少出现n次
{n,m} 出现n-m次
②特殊元字符
\ 转义字符,可以把特殊元字符转成普通的,也可以倒过来
. 任意字符(除了换行符以外)
^ 以...开头--------两个一起用,必须一模一样才可以匹配,单个用,符合就行
$ 以...结尾
\n 换行符
\d 0-9之间任意数字
\D 非0-9之间任意数字
\w 数字、字母、下划线
\t 制表符
\b 单词边界
\s 空白符
x|y x和y之间任意一个
[a-z] a-z之间任意一个字符
[a-zA-Z0-9] a-z或者A-Z或者0-9之间任意字符
[^a-z] 除了a-z之间任意一个字符
() 分组:作用是提高匹配优先级 分组引用 分组捕获
(?: ) 只匹配不捕获
(?=) 正向预查
(?!) 负向预查
③普通元字符
普通的能代表自身意思的
2、修饰符(可省略)
i ignoreCase 不区分大小写
m multiline 多行匹配
g global 全局匹配
4、正向预查、负向预查
let reg=/aaa(?=bbb)/;//aaa后边必须是bbb----正向预查
let reg=/aaa(?!bbb)/;//aaa后边不能是bbb----负向预查
5、捕获生日
let reg=/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(?:\d|x)$/;
let res=reg.exec('130731199710309876');
console.log(`您当前的生日是${res[2]}年${res[3]}日${res[4]}日`);
//您当前的生日是1997年10日30日
6、匹配身份证号
reg = /^(?:\d{6})((?:19|20)\d{2})(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{2}(\d)(?:\d|X)$/;
console.log(reg.test('110189198503160130'));//true
7、检测是否为有效数字
let isNaN=/[+-]?(\d|[1-9]\d+)(\.\d+)?/;
console.log(isNaN.test("2"));//true
let isNaN=/^([+-])?(\d|[1-9]\d+)(\.\d+)?$/;
console.log(isNaN.test("-+2"));//false
8、匹配邮箱
/* 邮箱 */
let reg=/^[a-zA-Z0-9_]{6,}@[a-zA-Z0-9]{2,3}(\.[a-zA-Z]+){0,2}$/;
console.log(reg.test("18732318396@163.com"));//true