正则捕获
把一个字符串中和正则匹配的部分获取到
正则
- exec
- test
字符串
- replace
- split
- match
基于EXEC可以实现正则的捕获
- 如果当前正则和字符串不匹配,捕获的结果是NULL
- 如果匹配,捕获的结果是一个数组
- 0:大正则捕获的内容
- index:正则捕获的起始索引
- input:原始操作的字符串
- …
- 执行一次EXEC只能捕获到第一个和正则匹配的内容,其余匹配的内容还没有捕获到,而且更恶心的是,我傻傻的执行多次,然而并没啥卵用 =>“正则的捕获有懒惰性”:只能捕获到第一个匹配的内容,剩余的默认捕获不到
- 解决正则捕获的懒惰性,我们需要加全局修饰符G(这个是唯一的方案,而且不加G不管用什么办法捕获,也都不能把全部匹配的捕获到)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27let str = 'zhufeng2018peixun2019';
let reg = /\d+/;
console.log(reg.exec('zhufengpeixun'));//=>null
console.log(reg.exec(str));//=>['2018',index:7,input:...]
//=>LAST-INDEX不变导致了正则捕获的懒惰性
console.log(reg.lastIndex);//=>0 正则捕获时候,下一次在字符串中开始查找的索引
console.log(reg.exec(str));//=>['2018']
--------------------------------------------------------
//=>即使我们手动修改了LAST-INDEX,然而还是没用
console.log(reg.exec(str));//=>['2018']
reg.lastIndex = 11;
console.log(reg.lastIndex);
console.log(reg.exec(str));//=>['2018']
// 需要正则表达式加上全局匹配符 ‘g’
// let str = 'zhufeng2018peixun2019';
// let reg = /\d+/g;
// console.log(reg.lastIndex);//=>0
// console.log(reg.exec(str));//=>['2018']
// console.log(reg.lastIndex);//=>11
// console.log(reg.exec(str));//=>['2019']
// console.log(reg.lastIndex);//=>21
// console.log(reg.exec(str));//=>null
// console.log(reg.lastIndex);//=>0
// console.log(reg.exec(str));//=>['2018']
?在正则中的作用
- 量词元字符:出现零次或者一次
- /-?/ 让减号出现一次或者不出现
- 取消贪婪性
- /\d+?/ 捕获的时候只捕获最短匹配的内容
- ?: 只匹配不捕获
- ?= 正向预查
- ?! 负向预查
1 | let str = 'zhufeng2018peixun2019'; |
replace:实现正则捕获的方法(本身是字符串替换)
1 | //==============REPLACE原理 |
- REG 和 STR 匹配多少次,函数就被触发执行对少次,而且传递了一些参数信息值
- 每一次ARG中存储的信息,和执行EXEC捕获的信息相似(内置原理:每一次正则匹配到结果,都把函数执行,然后基于EXEC把本次匹配的信息捕获到,然后把捕获的信息传递给这个函数)
- 每一次函数中返回的是啥,就把当前大正则匹配的内容替换成啥
1 | let str = "2018/4/30 17:50:23"; |
时间字符串格式化
1 | String.prototype.myFormatTime = function myFormatTime(template = '{0}年{1}月{2}日 {3}时{4}分{5}秒') { |