JavaScript正则表达式
RegExp - 正则表达式(Regular Expression)也叫规则表达式,是一个复杂数据类型(object)。
作用
1、专门用来验证字符串是否符合规则
2、从字符串里面获取一部分符合规则的内容
正则表达式的创建
1、字面量创建
const reg=/abc/
2、内置构造函数创建
const reg=new RegExp('abc')
两种创建方式的区别:
1)语法不同
2)字面量创建不能进行字符串拼接,内置构造函数可以进行字符串拼接
3)书写基础元字符的区别:字面量创建的可以直接 \d,内置构造函数需要 \d
正则表达式的两个方法
1、匹配
验证字符串是不是符合正则规则
语法:正则.test(你要检测的字符串),返回值是一个布尔值,符合返回true,不符合返回false
2、捕获
从字符串里面获取符合正则规则的那一部分片段
语法:正则.exec(你要捕获的字符串)
返回值:字符串里面没有符合规则的片段返回null
字符串里面有符合规则的片段,如果是基础捕获,返回值是一个数组,数组的第一项是捕获的片段,不管有多少片段,都只捕获第一个片段,不管捕获多少次,都是第一个片段.
正则表达式元字符
组成正则的基本符号,已符号的形式来代替文本内容,把所有的文本内容归结成一些符号来代替
基础元字符
\s 表示一个空格
\S 表示一个非空格
\t 表示一个制表符(tab),一个制表符,不是多个空格
\d 表示一个数字
\D 表示一个非数字
\w 表示一个 数字 或者字母 或者下划线
\W 表示一个 非 数字或者字母或者下划线,数字或者字母或者下划线以外的字符
. (点) 表示非换行的任意字符(字符串中\n表示换行)
\(斜线) 表示转义符,把没有意义的内容转换成有意义的内容,把有意义的内容转换成没有意义的内容
边界元字符
^ 表示字符串的开始
$ 表示字符串的结束
限定元字符
写在普通元字符或者字母符号的后面,修饰前面 ‘一个符号’ 的出现次数
* 表示出现0到多次
+ 表示出现1到多次
?表示0次或1次
{n} 表示出现n次,n前后不能有空格
{n,} 表示出现n到多次,只是出现n次
{n,m} 表示出现n到m次
正则的贪婪和非贪婪
贪婪性:
当你给一个符号使用限定符的时候,在你捕获的时候,会尽可能多的去捕获内容,我们管这个特效叫做正则的贪婪性
非贪婪性
正则在捕获的时候尽可能的按照最小来捕获(写限定符的时候,在后面多加一个?号)
+?
const reg=/\d+/
reg.exec('ab12345cd') //在捕获的时候会尽可能捕获最大长度,12345
const reg=/\d+?/
reg.exec('ab12345cd') //在捕获的时候会按照最小数量捕获,1
*?
const reg=/\d*/
reg.exec('121345') //捕获 12345
const reg=/\d*?/
reg.exec('121345') //捕获 没有
??
const reg=/\d?/
reg.exec('121345') //捕获 1
const reg=/\d??/
reg.exec('121345') //捕获 没有
一下都是捕获n个,按最少的捕获
{n}?
{n,}?
{n,m}?
特殊元字符
()小括号,表示一个整体或者单独捕获。单独捕获的时候,从左边开始依次捕获小括号内容。
一个整体
//表示abc这个整体出现两次
const reg=/(abc){2}/ //abcabc
单独捕获
const reg=/\d+(\s+)\d+/ //单独捕获小括号内容,多个空格
const reg=/(\d+(\s))\d+/ //先捕获外面小括号内容,再捕获里面小括号内容
(?:)整体匹配但不捕获,只是标志一个整体,但是捕获的时候不会单独捕获出来
const reg=/\d+(?:\s+\d+){2}/ //小括号里面当成一个整体,但不捕获
| 占位或,表示左边或者右边都行,分开的是|左边或者右边整体,大部分时候和()连用,表示一个整体或另一个整体
const reg=/(abc|def)/
const reg=/^abc|def$/
[] 表示里面的任意一个都行,注意是一个,只匹配里面的任意一个。
const reg=/[abcd]/ 匹配abcd的任意一个
[^] 表示非里面的任意一个都行,也是一个。
const reg=/[^abcd]/ 表示你的字符串要由一个字符组成,只要不是abcd中的任意一个就可以
- 表示 至 或者 到,是使用再[] 里面的一个符号,表示从一个字符到另一个字符,前提是他们在ASCII码是连着的
const reg=/^[0-9]$/ 表示0到9任意一个数字
const reg=/^[a-z]$/
const reg=/^[A-Z]$/
组合形式
[0-9a-zA-Z_] 等价于 \w
[^0-9a-zA-Z_] 等价于 \W
[0-9] 等价于 \d
[^0-9] 等价于 \D
[ ] 等价于 \s
[^ ] 等价于 \S
特殊说明,当点这符号(.)出现在[]或者[^]里面的时候表示一个点文本,不再表示非换行任意字符,而是表示他本身
正则表达式的预查
正向预查
正向肯定预查
当在捕获一个内容的时候,后面必须跟着是我选择的某一个才可以 ,符号问等(?=)
正向否定预查
当在捕获一个内容的时候,后面必须跟着不是我选择的某一个才可以,符号问叹 (?!)
负向预查
负向肯定预查
当在捕获一个内容的时候,前面必须是我选择的某一个才可以,符号 (?<=)
负向否定预查
当在捕获一个内容的时候,前面必须不是我选择的某一个才可以,符号 (?<!)
1.正向肯定预查
//字符串 ES20015 或者ES2016 可以捕获,但只捕获ES,不需要2015或者2016
const reg=/ES(?=2015|2016)/
console.log(reg.exec('ES2015'))
console.log(reg.exec('ES2016'))
2.正向否定预查
const reg=/ES(?!2015|2016)/
3.负向肯定预查
const reg=/(?<=2015|2016)ES/
console.log(reg.exec('2015ES'))
4.负向否定预查
const reg=/(?<!2015|2016)ES/
重复出现
\num ,num表示一个正整数,比如\1\2,num是一个数字,表示正则第num个可被捕获的小括号(),这个可被捕获的小括号位置是什么,就出现一份一模一样的内容
//表示重复出现第一个小括号,一模一样的内容一遍
const reg=/(abc|def)\d+\1/
console.log(reg.test('abc123abc')) //true
console.log(reg.test('abc123def')) //false
正则表达式的标识符
标识符是写在正则表达式的外面,用来修饰整个正则表达式的,由三个标识符
i 忽略大小写
g 全局
y 粘性全局
语法 /正则/igy 或者 new RegExp('正则','igy')
1.忽略大小写
const reg=/[abc]/i
2.全局
const str='abc123abc456abc789'
const reg=/\d{3}/ 只能匹配和捕获的时候,都只能找到第一个,123
当有全局标识符的时候,捕获第二次会从第一次的结束位置开始查找,直到找不到了,返回null,再后面,又回到【0】位置开始捕获,中途进行匹配或者捕获都是影响下一次开始的位置。
const reg=/\d{3}/g //多次匹配就可以匹配到 123 456 789
console.log(reg.exec(str)) //结束位置是 [5],捕获123
console.log(reg.exec(str)) //开始位置是 [6],捕获456,以此类推
3.粘性全局
每一次捕获的时候
第一次必须是从[0]位置就刚好能捕获到内容
第二次必须是从第一次结束位置开始就刚好能捕获到内容才可以
const str='123456abc'
const reg=/\d{3}/y
console.log(reg.exec(str)) //123
console.log(reg.exec(str)) //456
如果 str='abc123',就匹配不到
正则表达式的两个方法
-
test() 匹配,验证字符串是不是符合正则规则
语法:正则.test(要检测的字符串)
返回值:一个布尔值,符合为true,不符合为false -
exec()捕获,从字符串里面获取符合正则规则的那一部分片段,
语法:正则.exec(要捕获的字符串)
返回值:
1.字符串里面没有符合规则的片段返回null
2.字符串里面有符合规则的片段,
1)基础捕获。返回值是一个数组,[0]项是捕获出来的片段,不管有多少个片段,都只是捕获第一个片段,不管捕获多少次,都是第一个片段
2)当正则表达式有小括号()的时候
返回值是一个数组,从索引[1]开始一次是每一个小括号的单独捕获
3)当正则有全局标识符g的时候
第二次捕获会从第一次捕获的结束位置开始继续向后查找,直到找不到为止,返回null,再后面一次捕获,依旧会从[0]位置开始查找
字符串和正则合作的方法
这些方法都是字符串的常用方法,只不过参数位置可以写正则。
1.search()
语法:
字符串.search(字符串片段)
字符串.search(正则表达式)
返回值:
如果找到就返回对应的索引,没有就返回 -1
const str='sbc123dfg'
console.log(str.search('123'))
console.log(str.search(/\d{3}/))
2.replace()
语法:
字符串.replace(字符串片段,要替换的内容)
返回值,只能替换第一个查找到的内容,返回替换后的字符串
字符串.replace(正则表达式,要替换的内容)
返回值:没有全局标识符g的时候,只能替换第一个查找到的内容,返回替换后的字符串
有全局标识符g的时候,会把字符串内所有满足正则规则的内容全部替换,返回替换好的字符串
3.match()
语法:
字符串.match(字符串片段)
字符串.match(正则表达式)
返回值:查找到字符串内一个满足字符串片段的内容返回,返回格式和exec一模一样
当正则表达式没有全局标识符g的时候,返回值和exec一模一样
当正则表达式有全局标识符g的时候,返回一个数组,里面是所有满足条件的内容
const str='hello 你好 world hello 你好 world'
console.log(str.match('你好'))
console.log(str.match(/你好/))
console.log(str.match(/你好/g))
正则匹配中文
正则表达式里面 \u 表示查找中文,后面带上中文的四位Unicode编码
[\u4e0-\u9fa5] 表示任意一个中文字符
const str='hello 你好 world hello 你好 world'
console.log(str.match(/[\u4e0-\u9fa5]+/g)) //表示任意几个中文