正则表达式
初识正则:
正则表达式是由一个字符序列形成的搜索模式
当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
正则表达式可以是一个简单的字符,或一个更复杂的模式。
正则表达式可用于所有文本搜索和文本替换的操作
字面量创建正则表达式:
var reg = /正则表达式/修饰符
var reg = /hello/g
构造函数创建正则表达式:
var reg = new RegExp(‘正则表达式’,‘修饰符’);
正则表达式实例属性:
lastIndex:
没有设置全局(g)时始终为0.
设置了的话会移动到匹配字符的下一个位置,当没有可以匹配的字符后,下一轮exec返回null, test返回null。每次正则查找的起点都是lastIndex.
ignoreCase、global、multiline
判断正则表达式中是否有忽略大小写、全局匹配、多行匹配三个模式修饰符
var reg1 = /hello/igm;
console.log(reg1.ignoreCase); //true
console.log(reg1.global); //true
console.log(reg1.multiline); //true
字符分类:
普通字符、特殊字符、模式修饰字符。
普通字符:数字、字母、下滑线、汉字、没有特殊意义的符号。
特殊符号:\ :把特殊字符转义为普通字符。
模式修饰字符:
i :ignoredCase ——不区分大小写。
g:gloal 全局匹配
m:multiline 多行匹配。
正则表达实例方法:
exec用来匹配字符串是否符合正则表达式的字符串
匹配成功:返回一个result数组[ “匹配内容”,“匹配内容所在索引”,"input"参数字符串,“groups:undefined”]
匹配失败:返回null
如果正则中有全局(g)则reg中会记录满足条件字符的索引位置,在下一个执行exec时会从lastIndex开始,没有的话,每次执行都会重置记录位置。
test用来测试正则表达hi是否正确匹配。
值:true / false
直接量字符:
\n ——换行符。 \t ——制表符 \f——换页符
\r ——回车符
字符集合:
[ ] 在框内查找任何字符。
// 使用字符集合 满足其中一个字符,就会满足校验条件
特别注意:匹配任意不在括号内的字符,可以在字符集合内用’-'来连接指定范围内的字符。
// [^] [^0-9]除了0-9之间的数字都可以//
[^a-z]// [^A-Z]都是同理。
// ^写在[]内代表取反,写在[]表示什么开
边界字符:
^ 匹配输入开始。表示匹配行首的文本(以谁开始)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。
$ 匹配输入结尾。表示匹配行尾的文本(以谁结束)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。
如果 ^和 $ 在一起,表示必须是精确匹配。// var reg4 = /1
/
/
/
意
思
相
当
于
a
b
c
中
只
要
有
一
个
都
能
为
t
r
u
e
但
是
a
b
a
c
b
c
都
为
f
a
l
s
e
v
a
r
r
e
g
5
=
/
[
a
b
c
]
[
0
−
9
]
/ //意思相当于abc中只要有一个都能为true 但是ab ac bc都为false var reg5 = /^[abc][0-9]
///意思相当于abc中只要有一个都能为true但是abacbc都为falsevarreg5=/[abc][0−9]/
// 三选一 只有是a 或者是 b 或者是c 这三个字母才返回 true
var rg1 = /2
/
;
/
/
26
个
英
文
字
母
任
何
一
个
字
母
返
回
t
r
u
e
−
表
示
的
是
a
到
z
的
范
围
v
a
r
r
e
g
=
/
[
a
−
z
]
/; //26个英文字母任何一个字母返回 true - 表示的是a 到z 的范围 var reg = /^[a-z]
/;//26个英文字母任何一个字母返回true−表示的是a到z的范围varreg=/[a−z]/
//取反 方括号内部加上 ^ 表示取反,只要包含方括号内的字符,都返回 false 。
var reg2 = /[a-zA-Z0-9]$/;
字符类:
\b 匹配一个零宽单词边界(zero-width word boundary),表示一个单词(而非字符)边界,也就是单词和空格之间的位置,或者字符(\w)与字符串开头或者结尾之间的位置。
\B 匹配一个零宽非单词边界(zero-width non-word boundary),与"\b"相反。
// \d->[0-9]表示\d 意味着[0-9]的内容
// \D->[^0-9]
// \w->[a-zA-Z0-9]
// \W->[^a-zA-Z0-9]
// \s 匹配任何Unicode空白字符,包括空格、制表符、换页符等,等效于[\f\t\n\r]
// \S 等效于**[^\f\t\n\r]**
数量词:
// {n,} 大于等于N次
// {n,m}大于等于n次,小于等于m次
// {n} 固定重复n次
// ?允许出现0次或1次
// + 允许出现1次或者多次
// *允许出现0次或者多次
一些特别的案例:
匹配QQ号:
不以数字0开头,只能由数字组成,5-11位的长度。
var reg = /^[1-9]\d{4,10}$/
console.log(reg.test('12343123161'))//true
匹配身份证号:
var reg =/^[1-9]\d{16}[xX\d]$/
log (reg.test('4123456123421324X')) // true
重复方式
1)贪婪模式:
尽可能多的匹配(首先取最多可匹配的数量为一组进行匹配),当匹配剩余的字符串,还会继续尝试新的匹配,直到匹配不到为止,为默认模式。
// 对字符串"123456789",匹配其中的数字3-6次:\d{3,6},先匹配数字出现6次的字符串(123456),然后再从剩余字符串(789)中匹配出现数字3次的情况,剩余字符若没有出现数字3次则停止匹配.
```javascript
var str = "123456789";
var reg = /\d{3,6}/g;
console.log(reg.exec(str)); //[ '123456', index: 0, input: '12345678', groups: undefined ]
console.log(reg.exec(str)); // [ '789', index: 6, input: '123456789', groups: undefined ]
console.log(reg.exec(str)); // null
##### 2)非贪婪模式:
尽可能少的匹配(每次取最少匹配的数量为一组进行匹配),直到匹配不到为止
**使用方法**:在量词后加上 **?**
// 对字符串"123456789",匹配其中的数字3-6次:\d{3,6},先匹配数字出现3次的字符串(123),然后再从剩余字符串(456789)中匹配出现数字3次的情况,剩余字符若没有出现数字3次则停止匹配.
```javascript
var str = "123456789";
var reg = /\d{3,6}?/g;
console.log(reg.exec(str)); //[ '123', index: 0, input: '123456789', groups: undefined ]
console.log(reg.exec(str)); // [ '456', index: 3, input: '123456789', groups: undefined ]
console.log(reg.exec(str)); // [ '789', index: 6, input: '123456789', groups: undefined ]
分组:
下面的正则表达式可以匹配’briupbriupbriup’
而另一种更优雅的写法是:
/briup{3}/ //用圆括号包裹的小整体成为分组
候选:
一个分组中可以有多个候选表达式:(用|分割)
var reg = /I Like (basketball|football|table tennis)/
console.log(reg.test('I Like basketball')); //true
console.log(reg.test('I Like football')); //true
console.log(reg.test('I Like table tennis')); //true
捕获与引用:
被正则表达式匹配(捕获)到的字符串会被暂存起来。其中,由分组捕获的串会从1开始编号,于是我们可以引用这些串:
var reg = /(\d{4})-(\d{2})-(\d{2})/
var date = '2021-08-29'
reg.test(date)
// 捕获之前要先test/exec
```javascript
console.log(RegExp.$1); //2021
console.log(RegExp.$2); //08
console.log(RegExp.$3); //29
``
$1引用了第一个被捕获的串,$2是第二个,依次类推
一些基础的正则表达式案例:
匹配11位有效的电话号码:
var reg = /^[1-9][3,4,5,7,8]\d{9}$/
console.log(reg.test('15345678911'));//true
密码验证:
设置能以任何数字、不区分大小写字母以及!@#$%这几个特殊字符组成,并且大于六位的密码:
var reg = /(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#%&]){6,}/;
console.log(reg.test('As3@31234'))//true