1.正则是什么
正则是一个用来处理字符串的规则
-
正则只能用来处理字符串
-
处理一般包含两方面
-
-
验证当前字符串是否符合某个规则
正则匹配
-
把一个字符串中符合规则的字符获取到
正则捕获
-
-
2.正则的组成部分
每一个正则都是有修饰
元字符
,修饰符
两部分组成
-
正则两个斜杠之间包起来的都是
元字符
,斜杠后面出现的都是修饰符
let reg=/^\d+$/g;
3.正则的两种创建方式
-
字面量方式
let reg=/^\d+$/g;//=>字面量方式
-
构造函数方式
let reg=new RegExp("\\d+$","g");//=>构造函数方式
4.常用修饰符
-
i
:ignoreCase,忽略大小写匹配 -
m
:multiline,多行匹配 -
g
:global,全局匹配
5.常用元字符
5.1.特殊元字符
-
\d
:0~9之间的一个数字 -
\D
:非0~9之间的任意字符 -
\w
:数字,字母,下划线
中的任意一个=>/[0-9a-zA-Z_]/
等价于\w
-
\s
:匹配任意一个空白字符(包括\t
制表符[TAB键四个空格]) -
\b
:匹配边界符,如:"zhang"(z左边和g右边就是边界),“zhang-san”(z左边,g右边,s左边,n右边就是边界) -
\n
:匹配一个换行符 -
\
:转义字符(把一个普通字符转义为特殊的字符,例如:\d
,把有特殊含义的转义为普通意思,例如:\.
此处的点就不是任意字符,而是一个小数点) -
.
:除了\n
以外的任意字符 -
^
:以某个元字符开头 -
$
:以某个元字符结尾 -
x|y
:x或y中的任意一个(a|z...) -
[xyz]
:x或y或z中的任意一个 -
[^xyz]
:除了x,y,z以外的任意字符 -
[a-z]
:获取a-z中的任意一个字符([0-9]等价于\d
) -
[^a-z]
:除了a-z
的任意字符 -
()
:正则分组 -
(?:)
:当前分组只匹配不捕获 -
(?=)
:正向预查 -
(?!)
:负向预查
5.2.量词元字符:让其左边元字符出现多少次
-
*
:出现零到多次 -
?
:出现零到一次 -
+
:出现一到多次 -
{n}
:出现n次 -
{n,}
:出现n到多次 -
{n,m}
:出现n到m次
5.3.普通元字符
只要在正则中出现的元字符(在基于字面方式创建),除了特殊和有量词意义的以外,其余的都是普通元字符
6.中括号
[xyz]
[^xyz]
[a-z]
[^a-z]
-
中括号中出现的元字符一般都是代表本身的含义
-
中括号中出现的两位数,不是两位数,而是两个数字中的任意一个
只能是xxx
//=>只能是xxx, "."代表处理/n以外的任意字符,"+"一到多次 let reg=/^.+$/ console.log(reg.test('aa'));//=>true console.log(reg.test('b'));//=>true console.log(reg.test('\n'));//=>false
出现一到多个"."
//=>出现一到多个"." ,中括号包起来的点代表自己本意就是点 let reg=/^[.]+$/ console.log(reg.test('aa'));//=>false console.log(reg.test('b'));//=>false console.log(reg.test('\n'));//=>false console.log(reg.test('.'));//=>true console.log(reg.test('..'));//=>true
0~9中的任意字符
//=>0~9中的任意字符,"\d"这里依然带边0~9的一个数字 let reg=/^[\d]$/; console.log(reg.test('0'));//=>true console.log(reg.test('d'));//=>false
以1开始与结束或者以8开始与结束
//=>以1开始与结束或者以8开始与结束,中括号中两位数,不是两位数,而是两位数中的任意一个 let reg=/^[18]$/; console.log(reg.test('1'));//=>true console.log(reg.test('8'));//=>true console.log(reg.test('18'));//=>false console.log(reg.test('11'));//=>false console.log(reg.test('88'));//=>false
1或者2~6或者5中的一个
//=>1或者2~6或者5中的一个 let reg=/^[12-65]$/; console.log(reg.test('1'));//=>true console.log(reg.test('2'));//=>true console.log(reg.test('6'));//=>true console.log(reg.test('5'));//=>true console.log(reg.test('4'));//=>true console.log(reg.test('44'));//=>false console.log(reg.test('7'));//=>false
案例:
年龄:18~65之间
/* * 18~19 (1[89]) * 20~59 ([2-5]\d) * 60~65 (6[0-5]) */ let reg=/^((1[89])|([2-5]\d)|(6[0-5]))$/
编写一个规则,匹配 "[object AAA]"
//编写一个规则,匹配 "[object AAA]" let reg=/^\[object .+\]$/
7.分组
-
改变默认的优先级
-
分组捕获
-
分组引用
18或者19
//=>18或者19 let reg=/^(18|19)$/ console.log(reg.test(18));//=>true console.log(reg.test(19));//=>true console.log(reg.test(89));//=>false console.log(reg.test(81));//=>false console.log(reg.test(181));//=>false
正则中出现的\1代表和第一个分组出现一模一样的内容...
//=>正则中出现的\1代表和第一个分组出现一模一样的内容... let reg=/^([a-z])([a-z])\2\1$/; console.log(reg.test('oppo'));//=>true console.log(reg.test('popo'));//=>false
编写一个正则匹配身份证号码
/** * '130828199012040617' * 前六位:130828 地区 * 中间8位:1990120 出生年月日 * 最后4位:0617 =>倒数第二位:奇数=男 偶数=女 */ //=>只能匹配是否符合格式,不能提取出身份证中的一些信息 // let reg=/^\d{17}(\d|X)$/ //=>EXEC实现的是正则捕获,获取的结果是一个数组,如果不匹配获取的结果是null, //=>捕获的时候不仅把大正则匹配的信息捕获到,而且每一个小分组中的内容也捕获到了(分组捕获) : //=>["130828199012040617", "130828", "1990", "12", "04", "1", index: 0, input: "130828199012040617"] let reg=/^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(?:\d|X)$/
8.正则捕获
正则捕获使用的是正则中的exec()方法
-
如果可以匹配获取的结果是一个数组,如果不能匹配获取的结果是null
-
如果我们只在匹配的时候,想要获取大正则中部分信息,我们可以把这部分使用小括号包起来,形成一个分组,这样在捕获的时候,不仅可以把大正则匹配的信息捕获到,而且还单独的把小分组匹配的部分信息也捕获到了(分组捕获)
-
有时候写小分组不是为了捕获信息,只是为了改变优先级或者进行分组引用,此时我们可以在分组的前面加上
?:
,代表只去匹配,但是不把这个分组内容捕获
9.案例
有效数字
/** * 有效数字 1.正数 负数 零 2.小数 整数 分析规则: 1.可以出现+/-号:可以没有,也可以有一个 2.整数 0 12 9 : 一位或者多位数字,一位0~9,多位数字不能以0开头 3.小数部分:可能有可能没有,有小数点后面至少要跟一位数字 */ let reg=/^(+|-)?([1-9]\d+)(\.\d+)?$/
电话(手机)号码
/** * 电话(手机)号码 1. 11位数字 2. 以1开头 */ let reg=/^1\d{10}$/
中文姓名
/* * 中文姓名 * 1. 中文汉字 [\u4E00-\u9FA5] * 2. 尼古拉斯·赵四 */ let reg=/^([\u4E00-\u9FA5]){2,}(·[\u4E00-\u9FA5]{2,})?$/
邮箱
/* * 邮箱 * xxxx@xxx.xx.xx * * 第一部分:数字、字母、下划线、-、.,但是-和.不能作为开头,不能连续出现-或者. * * 第二部分:xxx.xx.xx xxx.xx xxx.xx.xx.xx xxx-xxx-xx.xx.xx * */ let reg=/^\w+([-.]\w+)*@[A-Za-z0-9]+([-.][A-Za-z0-9]+)*(\.[A-Za-z0-9]+)$/
【珠峰笔录】