JesseZhao1990 / blog

learing summary
MIT License
62 stars 7 forks source link

正则表达式总结 #143

Open JesseZhao1990 opened 6 years ago

JesseZhao1990 commented 6 years ago

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. 预定义类

正则表达式提供了一些预定义类来匹配常见的字符类。如

字符 等价类 含义
. [^\r\n] 除了回车符和换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\r] 空白符
\S [^\t\n\x0B\f\r] 非空白符
\w [a-zA-Z_0-9] 单词字符(字母,数字和下划线)
\W [^a-zA-Z_0-9 非单词字符

7. 边界

^ 表示开头,$ 表示结尾, \b 单词边界,\B 非单词边界

8. 量词

字符 含义
0到1一次,最多一次。
+ 1到n次,最少1次。
* 0次或者多次,也就是任意次
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

9. 贪婪模式和非贪婪模式

贪婪模式式表示尽可能多的匹配,非贪婪模式表示尽可能少的匹配。在量词后边加上?即可表示非贪婪模式。比如: image

10. 分组

分组可以达到使量词作用与某个整体的作用。比如我想匹配dog出现五次的字符串,用/(dog){5}/ 即可 image 字母后面跟个数字并且连续出现三次 image 同一个数字连续出现多次, \1 表示反向引用 image

11. 或

| 表示或 比如匹配赵建或者张建, 两种方法 image image

12. 反向引用

如何取到捕获到分组内容呢?这个叫反向引用。如更改日期的格式。 将yyyy-mm-dd改成 dd/mm/yyyy image 如果不希望捕获某些分组,只需要在分组内加上?:即可。如下图所示。$3被当成了文本直接替换了。证明第三个分组被忽略了 image

13. 前瞻和后顾

正则表达式从文本头部向尾部开始解析,文本末尾方向,称为“前”。 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言。后顾的话方向相反。js中不支持后顾

名称 正则 含义
正向前瞻 exp(?=assert)
负向前瞻 exp(?!assert)

比如替换字符后面跟着数字的字符 image

直观示意图 image

14. 正则表达式的对象属性

举例: image

15. test 和 exec方法

15.1 RegExp.prototype.test(str)

用于测试字符串参数中是否存在匹配正则表达式模式的字符串,如果存在则返回true,否则返回false

注意: 当正则表达式加上g的时候,执行test方法,lastIndex会变化,可能会导致每次执行test的方法得到的结果不一致。如下图所示。 image 实际上,test方法用于测试某个字符串是否含有满足条件的字符的。g是没必要加的。如果想知道具体的在第几个字符匹配上的。可以用exec方法

15.2 RegExp.prototype.exec(str)

使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果,如果没有匹配的文本则返回null,否则返回一个结果数组.

举例。非全局调用 image

全局调用 image

16. 字符串对象和正则相关的方法

search只搜索第一个满足条件的字符串。不管加不加g image macth的话加g和不加g差异很大。 image replace的话加g是全局替换,不加g只替换第一个满足条件的 image

MatriXiao88 commented 4 years ago

其实正则里面定义前瞻后顾这样的名词真的让人有点难以理解,我觉得理解为自定义边界字符组是最容易理解的 \b和^$这样的是限定规则的边界匹配,x(?=8)表示匹配右边边界字符是8的x

JesseZhao1990 commented 4 years ago

其实正则里面定义前瞻后顾这样的名词真的让人有点难以理解,我觉得理解为自定义边界字符组是最容易理解的 \b和^$这样的是限定规则的边界匹配,x(?=8)表示匹配右边边界字符是8的x

其实还好吧。正则的匹配过程就是顺着往前匹配的过程,在匹配每个字符的时候,往前看看,是否满足条件,往后看看是否满足条件。前瞻英文是Look ahead,即为往前看。后顾英文是Look behind,即为往后看。