概念
正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。
创建正则表达式
两种方法:字面量方式、构造函数方式
1var re = /ab+c/;
2
3var re = new RegExp("ab+c");
正则表达式常用方法
- 校验数据
test(字符串)
测试字符是否满足正则表达式规则,如果测试到有,则返回true;没有则返回flase
语法:正则表达式.test(字符串) 正则表达式提供的方法
1var reg=/[123]/
2var str='1'
3var result=reg.test(str)
4console.log(result)
search(正则表达式)
search() 方法执行正则表达式和 String 对象之间的一个搜索匹配。
语法:字符串.search(正则表达式) 字符串提供的方法
1var reg=/\d/
2var str="abcdefg3sgbh"
3var res=str.search(reg)
4console.log(res)
1区别:
2.test()方法是正则表达式提供的,.search()是字符串提高的,
3.test()方法返回布尔值,search()返回下标
- 提取数据
正则表达式.exec(字符串)
exec() 方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null。 正则表达式提供的方法
1var reg=/\d/
2var str="abcd456efg"
3var res=reg.exec(str)
4console.log(res)
字符串.match(正则表达式)
match() 方法检索返回一个字符串匹配正则表达式的结果。 字符串提供的方法
1var reg=/\d/
2var str="abcd456efg"
3var res=str.match(reg)
4console.log(res)
1区别:
2正则表达式.exec(字符串),正则表达式提供的方法
3字符串.match(正则表达式) 字符串的方法
4相同:
5都返回一个数组,只要匹配到符合规则的数据就返回
- 替换数据
字符串.replace(正则表达式,新的内容)
replace() 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern是字符串,则仅替换第一个匹配项。字符串提供的方法
1var reg=/\d/
2var str="11123bcd"
3var res=str.replace(reg,"a")
4console.log(res)
断言
范围类
在[]组成的类内部是可以连写的
1let text = 'a1B2d3X4Z5'
2let reg=/[a-zA-Z]/
3text.replace(reg,'Q')
字符类
字符类取反
很多时候碰到这么一种情况,即不想匹配某些字符,其他都匹配。此时,可以使用字符类取反——使用元字符^,创建反向类,即不属于某类的内容。
1[^abc]表示不是字符a或b或c的内容
1let reg=/[^abc]/g
2let text='a1b2c3d4e5'
3console.log(text.replace(reg,'X'))
修饰符
在正常情况下,正则匹配到第一个匹配项则停止,并且默认大小写敏感,如果想修改默认选项,则需要修饰符。
g:global全文搜索
1var reg=new RegExp('l');
2var a='hello'.replace(reg,'f')
3console.log(a)
1var reg=new RegExp('l','g');
2var a='hello'.replace(reg,'f')
3console.log(a)
i:ignore case 忽略大小写
1var reg=new RegExp('l','g');
2var a='helloHELLO'.replace(reg,'f')
3console.log(a)
1var reg=new RegExp('l','gi');
2var a='helloHELLO'.replace(reg,'f')
3console.log(a)
m:multiple lines 多行搜索
1var reg=new RegExp('od')
2var str='so good\n so good'
3var result=str.replace(reg,'hi')
4console.log(result)
5
6 so gohi
7 so good
1var reg=new RegExp('od','gm')
2var str='so good\n so good'
3var result=str.replace(reg,'hi')
4console.log(result)
5
6 so gohi
7 so gohi
其他标志符
s:允许 . 匹配换行符。
u:使用unicode码的模式进行匹配。
y:执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始。
量词符
贪婪模式
之前说了正则表达式的量词,但量词会带来一个到底匹配哪个的问题
例如:
1var str="12345678"
2var reg=/\d{3,6}/g
3str.replace(reg,'X')
可以看到结果是将123456 六个数字替换成了X,所以我们可以得到,正常模式下,正则表达式会尽可能多的匹配。正常情况下,正则表达式采用贪婪模式,即,尽可能多的匹配。
非贪婪模式
一但成功匹配不再继续尝试,这就是非贪婪模式。
只需要在量词后加上?即可
1var str="12345678"
2var reg=/\d{3,6}?/g
3str.replace(reg,'X')
分组
在使用正则表达式的时候会想要匹配一串字符串连续出现多次的情况,使用()可以达到分组的功能
例如:(hello){3}
使用符号 | (或)实现选择的功能
例如:
1var str='12341235'
2let reg=/123(4|5)/g
反向引用
将一种格式的时间字符串:yyyy-MM-DD转为MM/DD/yyyy类型格式字符串。
由于年月日是不固定的,没法直接转换为固定数值。这时我们可以使用反向引用解决这个问题。
利用$n,n代表着分组的序号,序号是从1开始的。
例如:
1let text='2022-02-23'
2let reg=/(\d{4})-(\d{2})-(\d{2})/
3let res=text.replace(reg,'$3/$2/$1')
4console.log(res)