正则表达式
正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
1.什么是正则表达式?
正则表达式是由一个字符序列形成的搜索模式。
当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
正则表达式可以是一个简单的字符,或一个更复杂的模式。
正则表达式可用于所有文本搜索和文本替换的操作。
2.正则表达式的创建
3.字符分类
普通字符 字母、数字、下划线、汉字、没有特殊含义的符号 (,;!@等)
特殊字符 : 将特殊字符转义成普通字符
模式修饰符 i:忽略大小写 m:多行匹配 g :全局匹配 字面量创建正则时,模式修饰符写在一对正斜线后
4.正则表达式实例方法
-
exec
如果匹配到,返回值是一个result数组:
[匹配的内容,index: 在str中匹配的起始位置,input: 参数字符串,groups: undefined]
否则返回null
注意点:
1)如果正则表达式中有修饰符"g",这时,在正则表达式的实例reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行exec的时候,从lastIndex开始检索。
2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索 -
test
用来测试待检测的字符串中是否有可以匹配到正则表达式的字符串,如果有返回true,否则返回false
注意点:
1)如果正则表达式中有修饰符"g",这时,在reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行test的时候,从lastIndex开始检索。
2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索 -
toString/toLocaleString
把正则表达式的内容转化成字面量形式字符串/有本地特色的字符串(JS中没效果)
-
valueOf
返回正则表达式本身
5.正则表达式实例属性
-
lastIndex
当没设置全局匹配时,该属性值始终为0
设置了全局匹配时,每执行一次exec/test来匹配,lastIndex就会移向匹配到的字符串的下一个位置,当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮
可以理解成,每次正则查找的起点就是lastIndex
-
ignoreCase global multiline
判断正则表达式中是否有忽略大小写、全局匹配、多行匹配三个模式修饰符
-
source 类似于toString
返回字面量形式的正则表达式
6.正则表达式语法-元字符
-
直接量字符
字母和数字字符->自身 \o->null字符 \t->制表符 \n->换行符 \v->垂直制表符 \f-> 换页符 \r->回车符
-
字符合集 方括号用于查找某个范围内的字符
[abc] 查找abc之间的任何字符
[0-9] 查找任何0-9的数字
[^xyz] 取反 匹配任意不在括号内的字符
- 边界符
^ 匹配输入开始 $ 匹配输入结尾
如果^和$在一起 表示必须是精确匹配
-
字符集与"^“和”$"一起使用
-
\b 匹配一个零宽单词边界
-
\B 匹配一个零宽非单词边界
-
字符类
1."." 除换行符\n和回车符之外的任何单个字符 2.\d 匹配一个数字字符 等效于[0-9] 3.\D 等效于[^0-9] 4.\w 匹配包括下划线的任何单个字符,包括A-Z,a-z,0-9和下划线,等效于[a-zA-Z0-9_] 5.\W [^a-zA-Z0-9_] 6.\s 匹配任何Unicode空白字符,包括空格、制表符、换页符等等 等效于[\f\t\n\r] 7.\S 等效于[^\f\t\n\r]
-
数量词
X* 匹配前面的模式 X->0或多次 等效于{0,}
X+ 匹配前面的模式X->1或多次 等价于{1,}
X? 匹配前面的模式 X->0或1次 等价于{0,1}
X{n} n为非负整数 前面的模式x重复出现n次时匹配
X{n,} n为非负整数 前面的模式x重复出现至少n次时匹配
X{n,m} n为非负整数 前面的模式x重复出现至少n次,至多m次时匹配
7. 重复方式
-
贪婪模式 尽可能多的匹配 当匹配剩余的字符串 还会继续尝试新的匹配 直到匹配不到为止,为默认模式
-
非贪婪模式 尽可能少的匹配 直到匹配不到为止
使用方法: 在量词后面加上?
8.选择,分组,引用
-
选择 字符"|"用于分隔供选择的字符, 选择项的尝试匹配次序时从左到右,直到发现匹配项 如果左边的选择项匹配,就忽略右边的匹配项,即使能产生更好的匹配
-
分组 用圆括号包裹成一个小整体成为分组
候选 一个分组中, 可以有多个候选表达式,用 | 分 隔开
捕获与引用 被正则表达式匹配(捕获)到的字符串会被暂存起来,其中由分组捕获的串会从1开始编号
var reg = /(\d{4})-(\d{2})-(\d{2})/ var date = '2021-08-29' reg.test(date) // 捕获之前要先test/exec console.log(RegExp.$1); //2021 console.log(RegExp.$2); //08 console.log(RegExp.$3); //29
嵌套分组的捕获 嵌套分组的捕获顺序规则是以左括号出现的顺序进行捕获
-
引用 正则表达式里也能进行引用 ,称为反向引用
注意:如果编号越界了会被当作普通的表达式
9.String对正则表达式的支持
-
search 匹配字符串 返回匹配字符串第一次出现的位置,否则返回-1 类似于exec
-
match 匹配字符串 返回一个数组 数组包括字符串内容、位置
如果正则设置全局匹配 一次性返回所有符合正则表达式的字符串数组
如果其中添加了分组,返回符合要求的字符串以及分组的一个数组,但如果同时开启全局匹配则不会在数组中添加分组内容
-
split 以某种形式分隔字符串 split(‘分隔符’) 将字符串转换为数组
-
replace 满足正则表达式条件的内容将被替换 replace(正则表达式,要替换的内容)
10.前瞻表达式
在正则表达式当中有个东西叫做前瞻,有的管它叫零宽断言:
表达式 | 名称 | 描述 |
---|---|---|
(?=exp) | 正向前瞻 | 匹配后面满足表达式exp的位置 |
(?!exp) | 负向前瞻 | 匹配后面不满足表达式exp的位置 |
由于 JS 原生不支持后瞻,所以这里就不研究它了。我们来看看前瞻的作用:
var str = 'Hello, Hi, I am Hilary.';
// 后面一定要匹配什么
var reg = /H(?=i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Hello, Ti, I am Tilary.
在这个DEMO中我们可以看出正向前瞻的作用,同样是字符"H",但是只匹配"H"后面紧跟"i"的"H"。就相当于有一家公司reg,这时候有多名"H"人员前来应聘,但是reg公司提出了一个硬条件是必须掌握"i"这项技能,所以"Hello"就自然的被淘汰掉了。
那么负向前瞻呢?道理是相同的:
var str = 'Hello, Hi, I am Hilary.';
// 后面一定不要匹配什么
var reg = /H(?!i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Tello, Hi, I am Hilary.
在这个DEMO中,我们把之前的正向前瞻换成了负向前瞻。这个正则的意思就是,匹配"H",且后面不能跟着一个"i"。这时候"Hello"就可以成功的应聘了,因为reg公司修改了他们的招聘条件,他们说"i"这门技术会有损公司的企业文化,所以我们不要了。
案例
1.匹配QQ号
// 不能以数字0开始,只能由数字组成,长度为5-11位
var reg = /^[1-9]\d{4,10}$/;
var str1 = "12311111111";
var result1 = reg.exec(str1);
console.log(result1);
2.匹配身份证号
// 不能以数字0开头,只能由数字组成,最后一位可能是x,X,数字
var reg = /^[1-9]\d{16}[xX\d]$/;
var str = "456337189654326541";
var result = reg.exec(str);
console.log(result);
3.验证是否为11位有效手机号码 (以1为开头,第二位为3,4,5,7,8中的任意一位,最后以0-9的9个整数结尾
var reg = /^[1][34578]\d{9}$/;
var str = "13000785566";
console.log(reg.test(str)); //true