正则
一个用来处理字符串的规则,通过规则我们可以验证字符串是否匹配对应的格式(TEST),也可以把正则匹配的结果在字符串中捕获到(EXEC)
正则由两部分组成:
- 修饰符:i(ignoreCase忽略大写小匹配)、m(multilin匹配多行)、g(global全局匹配,解决正则捕获的懒惰性)
- 元字符
- 特殊元字符
- :转译字符
- ^:以某一个元字符开头
- $:以某一个元字符结尾
- .:除了 (换行符)以外的任意字符
- d:0-9之间的一个数字,等价于[0-9]
- D:和d相反,除了0-9之间的任意字符,所有这类情况的(s、…)都有一个大写情况,也都是和本身意思相反
- :边界
- s:匹配任意一个空白字符(空格和制表符)
- w:匹配数字、字母、下划线中的任意一个,等价于[a-zA-Z0-9_]
- [xyz]:x、y、z三者中的任意一个
- [^xyz]:取反,除了x/y/x三者之外的任意字符
- [a-z]:获取范围中的任意一个字符
- [^a-z]:取反
- |:或者
- ():分组
- ?: :只匹配不捕获
- ?=:正向预查
- ?!:负向预查
- …
- 量词元字符
- *:出现零到多次
- +:出现一到多次
- ?:出现零次或者一次
- {n}:出现N次
- {n,}:出现n到多次
- {n,m}:出现n到m次
- 普通元字符:在 / / 包含起来的,除了具有特殊意义的,其余的都是代表本身意思的普通元字符
- 特殊元字符
[]的一些特殊情况:
- 中括号中出现的字符,大部分都是代表本身的意思,例如:
/^[d.]$/
d还是0-9之间一个数字,.不是任意字符只是一个小数点
- 中括号中不识别多位数字,例如:/[1]$/ 1或者2-4或者0,三者中的一个
()的作用:
- 改变优先级,栗如:
- /^18|29$/ 匹配18、29、182、189、829、129、1829…都符合
- /^(18|29)$/ 匹配18、29
- 分组捕获:在正则每一次捕获的时候,除了可以把大正则匹配的结果捕获到,还可以把里面小分组匹配的内容捕获到,栗如:
![](https://images2017.cnblogs.com/blog/1140938/201709/1140938-20170928131227356-864481752.png)
- 分组引用:1代表和第一个分组出现一模一样的内容,2和第二个分组出现一模一样的内容…
![](https://images2017.cnblogs.com/blog/1140938/201709/1140938-20170928131249200-1697468779.png)
- 查找当前是第几个有效分组
![](https://images2017.cnblogs.com/blog/1140938/201709/1140938-20170928131321544-1606236876.png)
- 常用的正则:
![](https://images2017.cnblogs.com/blog/1140938/201709/1140938-20170928131431622-1461034931.png)
![](https://images2017.cnblogs.com/blog/1140938/201709/1140938-20170928131459544-831080424.png)
正则的两个方法: 检测test 捕获exec
注意语法和返回值,区分字符串中的search,match,replace方法的用法
语法 : var reg = 6/^d+$/g;
reg.test('hello2017JavaScript');
reg.exec('hello2017JavaScript');
-
正则捕获的特点:
-
-
-
-
test、exec、match、replace、split…大部分字符串中支持正则的方法都可以实现正则的捕获
- 1)懒惰性->
如何解决懒惰性? ->在正则的末尾加一个修饰符"g"
global(g):全局匹配 ignoreCase(i):忽略大小写匹配 multiline(m):多行匹配 lastIndex:是正则每一次捕获在字符串中开始查找的位置,默认的值是0
原理:加了全局修饰符g,正则每一次捕获结束后,我们的lastIndex的值都变为了最新的值,下一次捕获从最新的位置开始查找,这样就可以把所有需要捕获的内容都获取到了
-
2)贪婪性 正则的每一次捕获都是按照匹配最长的结果捕获的
例如:2符合正则 2015也符合正则,我们默认捕获的是2015
var reg = /d+/g;//->出现一到多个0-9之间的数字 var str = "zhufeng2015peixun2016yangfan2017"; console.log(reg.exec(str));//->["2015"...]
如何解决正则的贪婪性 ->在量词元字符后面添加一个?即可
?在正则中有很多的作用:
放在一个普通的元字符后面代表出现0-1次 /d?/ ->数字可能出现也可能不出现
放在一个量词的元字符后面是取消捕获时候的贪婪性
- 1)捕获到的内容是一个数组
数组中的第一项是当前大正则捕获的内容
index:捕获内容在字符串中开始的索引位置
input:捕获的原始字符串
?的作用:①0或1次,②在量词修饰符后面加?是解决贪婪性,③?:reg是只匹配不捕获
分组捕获()
-
-
-
-
-
封装一个方法收集正则捕获到的结果
![](https://images2017.cnblogs.com/blog/1140938/201709/1140938-20170928152311544-1791067985.png)
- 字符串中可以使用正则的几个方法,区分与正则方法用法的差别
![](https://images2017.cnblogs.com/blog/1140938/201709/1140938-20170928152333794-1061830248.png)
- 小案例
- 1)检测有效数字
- 2)检测身份证号码
- 3)年龄范围18-65
- 4)replace方法实现20170418->贰零壹柒零肆壹捌
- 1)检测有效数字