Open JesseZhao1990 opened 6 years ago
其实正则里面定义前瞻后顾这样的名词真的让人有点难以理解,我觉得理解为自定义边界字符组是最容易理解的
\b和^$这样的是限定规则的边界匹配,x(?=8)
表示匹配右边边界字符是8的x
其实正则里面定义前瞻后顾这样的名词真的让人有点难以理解,我觉得理解为自定义边界字符组是最容易理解的 \b和^$这样的是限定规则的边界匹配,
x(?=8)
表示匹配右边边界字符是8的x
其实还好吧。正则的匹配过程就是顺着往前匹配的过程,在匹配每个字符的时候,往前看看,是否满足条件,往后看看是否满足条件。前瞻英文是Look ahead,即为往前看。后顾英文是Look behind,即为往后看。
1. 什么是正则?
Regular Expression(正则表达式),是使用单个字符串来描述匹配一系列符合某个语法规则的字符串。
有一个正则表示式的可视化工具。可以直观的理解一个正则表达式的意思: https://regexper.com/
2. 实例化正则表达式的方法
3. 正则表达式的组成
正则表达式由原义文本字符和元字符以及修饰符组成
元字符是在正则表达式中有特殊含义的非字母字符。比如: . * + ? $ ^| \ () {} []
修饰符 g i m
4. 字符类取反
^ 用在[] 中表示字符类取反。如/[^abc]/ 表示匹配非abc的字符
5. 范围类
[] 表示范围,如/[a-z]/表示匹配a到z的所有字符,/[a-zA-Z]/表示匹配a到z和A到Z的任意一个字符
6. 预定义类
正则表达式提供了一些预定义类来匹配常见的字符类。如
7. 边界
^ 表示开头,$ 表示结尾, \b 单词边界,\B 非单词边界
8. 量词
9. 贪婪模式和非贪婪模式
贪婪模式式表示尽可能多的匹配,非贪婪模式表示尽可能少的匹配。在量词后边加上?即可表示非贪婪模式。比如:![image](https://user-images.githubusercontent.com/15058550/41497680-c857cd48-718c-11e8-828f-a391d4b3b284.png)
10. 分组
分组可以达到使量词作用与某个整体的作用。比如我想匹配dog出现五次的字符串,用/(dog){5}/ 即可
字母后面跟个数字并且连续出现三次
同一个数字连续出现多次, \1 表示反向引用
![image](https://user-images.githubusercontent.com/15058550/65957764-48cf4200-e480-11e9-91de-5dcc87bb267f.png)
11. 或
| 表示或 比如匹配赵建或者张建, 两种方法
![image](https://user-images.githubusercontent.com/15058550/41497774-ee2735fc-718e-11e8-9cc8-be3b4f756143.png)
12. 反向引用
如何取到捕获到分组内容呢?这个叫反向引用。如更改日期的格式。 将yyyy-mm-dd改成 dd/mm/yyyy
如果不希望捕获某些分组,只需要在分组内加上?:即可。如下图所示。$3被当成了文本直接替换了。证明第三个分组被忽略了
![image](https://user-images.githubusercontent.com/15058550/41497825-31ec9402-7190-11e8-8638-58781f839ad0.png)
13. 前瞻和后顾
正则表达式从文本头部向尾部开始解析,文本末尾方向,称为“前”。 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言。后顾的话方向相反。js中不支持后顾
比如替换字符后面跟着数字的字符![image](https://user-images.githubusercontent.com/15058550/41497904-0edb5032-7192-11e8-9fea-3c51e4390b7b.png)
直观示意图![image](https://user-images.githubusercontent.com/15058550/41497908-323cba52-7192-11e8-9bb6-910c4213bcb4.png)
14. 正则表达式的对象属性
举例:![image](https://user-images.githubusercontent.com/15058550/41499644-f4773ce6-71b5-11e8-9909-e291471cc75b.png)
15. test 和 exec方法
15.1 RegExp.prototype.test(str)
用于测试字符串参数中是否存在匹配正则表达式模式的字符串,如果存在则返回true,否则返回false
注意: 当正则表达式加上g的时候,执行test方法,lastIndex会变化,可能会导致每次执行test的方法得到的结果不一致。如下图所示。
实际上,test方法用于测试某个字符串是否含有满足条件的字符的。g是没必要加的。如果想知道具体的在第几个字符匹配上的。可以用exec方法
15.2 RegExp.prototype.exec(str)
使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果,如果没有匹配的文本则返回null,否则返回一个结果数组.
举例。非全局调用![image](https://user-images.githubusercontent.com/15058550/41499795-1b689a22-71b9-11e8-98af-4c864d77e594.png)
全局调用![image](https://user-images.githubusercontent.com/15058550/41499801-2c8d33b2-71b9-11e8-9423-42a011a1ef60.png)
16. 字符串对象和正则相关的方法
search只搜索第一个满足条件的字符串。不管加不加g
macth的话加g和不加g差异很大。
replace的话加g是全局替换,不加g只替换第一个满足条件的
![image](https://user-images.githubusercontent.com/15058550/41499875-efc42fa6-71ba-11e8-9f0e-587ba87df291.png)