js-进阶 正则表达式
正则表达式
1、为什么需要正则表达式
因为我们常常要对用户输入的字符串进行匹配,看用户输入是否符合我们的要求
2、什么是正则表达式
所谓正则表达式,就是用于字符串中的 信息进行查找,替换和提取等操作。
创建正则表达式的方式,有两种,字面量,对象创建
字面量创建:
语法:let parttern=/正则规则/模式修正符
reg.test()
对象创建:
语法:let = new RegExp(”正则规则”,”模式修饰符”);
3、正则表达式的组成部分
如果是字面量创建正则的方式,正则可以分为4个部分:定界符//,原子at,元字符,模式修正符(前两个必须要写)
如果是对象方式创建的正则,那么就由3个部分组成:原子、元字符、模式修正符
4、定界符
就是约定正则表达式开始和结束的地方,使用的是一个斜杠(/)
5、原子
原子就是普通的字符,换句话说,正则里面写了什么原子,那么字符串就必须要出现这个字符。
6、元字符
就是有特殊含义的字符(+*?)
7、模式修正符
对正则表达式进行一定的扩充
i就是一个模式修正符,它可以忽略大小写
正则表达式类型和数组相同,无论哪种方式创建,返回类型都是object
元字符作为原子
方法很简单,元字符前面添加一个转译字符(\)
8、元字符具体符号
(1)字符组
使用方括号来进行表示。代表方括号里面的原子出现一个即可
let reg=/[abcd]/;
console.log(reg.test(“acc”));
范围:在字符组里面,正则表达式使用一个-来表示范围,可以简化字符组。
1.1 范围按照的是ASCLL码从小到大的排序,所以不能反着写。
1.2 在一个字符组里面可以书写多个范围
1.3 -只有在字符组里面才代表范围,如果出了字符组,那代表它原来的意思
排除:主要用于字符组里面,代表除了什么之外,用来表示^来表示
【^ 0-9】
排除符号书写在【后面,如果书写的位置不在它后面,则不代表排除,而代表它原来的意思
(2) 简记
对于0-9 ,a-z这种常用的,正则里面提供了默认的简单书写方式
\d:等同于[0-9],用于匹配数字
\D:等同于[^0-9],匹配非数
let reg=/^\dab/;
\s:代表匹配空白字符
\S:匹配非空白字符
\w:匹配数字字母下划线,等同于[0-9A-Za-z_]
\W:匹配非数字字母下划线。等同于[^0-9A-Za-z_]
(3) 点符号
点是匹配除了回车,换行,制表符以外的任意字符
匹配任意字符: [\d\D] [\w\W] [\s\S]
(4) 量词 (就是指的前面那个字符)
指定一个东西匹配多少次
{n} 匹配n次
{n.m}匹配至少n次,最多m次;
{n,}匹配至少n次
?可以出现,也可以不出现,相当于{0,1}
- 至少出现1次,或者1次以上 相当于{1, }
* 匹配0次或者多次 相当于 {0, }
贪婪模式和懒惰模式
贪婪模式:默认情况喜爱,量词的匹配都是贪婪模式,所谓贪婪,就是指能匹配多少个,就匹配多少个。(默认)
reg.exec(str);
懒惰模式:只要匹配上一个,就返回,后面的不再进行匹配
开启懒惰模式,只需要在量词后面添加一个?即可
(5)括号
两个功能:分组和引用
分组:就是将小原子组合成一个大的原子
let reg=/(ab){2}/;
捕获:括号不仅用于分组,还会保存每个分组所匹配的文本。等到匹配完成之后,可以引用捕获到的文本,通过$数字,默认是9个,分别对应$1-$9
RegExp.$ 1.2.3….
let reg=/(\d{4})-(\d{2})-(\d{2})/;
console.log(reg.test("2017-11-20"));
console.log(RegExp.$1);
console.log(RegExp.$2);
console.log(RegExp.$3);
反向引用:首先,这个还是和捕获的内容有关。我们可以对捕获的内容进行一个反向的引用,通过\数字来引用括号里面的内容
let reg=/(ab)(cd)\2/;
console.log(reg.test("abcdcd"))//true
非捕获(跳过某一个子表达式)使用?: 括号称为子表达式
let reg=/(?:ab)(cd)\1/;
console.log(reg.test("abcdcd"))//
()起始和结束****
如果是开始,使用^,如果是结束,使用$
let reg=/^\d{6}$/;
console.log(reg.test("610000"))
//匹配用户名 字母开头 5-8 长度不小于5
let reg=/^[a-z]\w{4,7}$/i;
选择:或者 |
需要注意:选择(|)的优先级是最低的,所以上看的正则匹配到的是ab或者cd,而不是a和b