1.1 什么是正则表达式
使用自定义的规则来及匹配、提取文本中想要的内容。它的灵活性、功能性以及逻辑性非常强,可以迅速的用极其简单的方式
,达到控制复杂字符串的目的
1.2 元字符
元字符 | 含义 |
---|---|
. | 匹配任意1个字符,除\n |
\b | 匹配一个位置, |
\d | 表示匹配一个数字,即0-9 |
\D | 表示匹配一个非数字,即不是数字 |
\s | 表示匹配一个空白字符,即空格、tab键 |
\S | 匹配一个非空白字符 |
\w | 匹配一个非特殊字符,即a-z、A-Z、0-9、_、汉字 |
\W | 匹配一个特殊字符,即非字母、非数字、非汉字 |
1.2.1 试用元字符
场景1:匹配9位qq号
\d\d\d\d\d\d\d\d\d
场景2:匹配任意N个字符(换行符除外)
....................
场景3:匹配10个非特殊字符
\w\w\w\w\w\w\w\w\w\w
1.3 匹配量词
匹配量词 | 含义 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有一次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符出现m次或更多次 |
{m,n} | 匹配前一个字符出现m到n次 |
1.3.1 试用量词
场景1:匹配qq号
\d{5,11}
场景2:匹配至少一个,至多无限个任意字符(换行符除外)
.+
1.4 匹配开头和结尾
匹配开头和结尾 | 含义 |
---|---|
^ | 匹配以……开头的 |
$ | 匹配以……结尾的 |
[^指定字符] | 表示除了指定字符都匹配 |
1.4.1试用开头和结尾
场景1:匹配开头是3的字符串
^3
场景2:匹配结尾是q的字符串
q$
匹配分组
匹配分组 | 含义 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 表示将括号中字符作为一个分组 |
\num | 表示引用分组num匹配到的字符串 |
(?P |
表示分组起别名 |
?P=name | 表示引用别名为name分组匹配到的字符串 |
(分组数据) | 分组数据是从左到右的方式进行分配的,最左边的是第一个分组,以此类推 |
捕获和非捕获
捕获实际上就是正则匹配,但是经常和分组一起使用,所以也叫捕获组和非捕获组
1.捕获组
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显示命名的组里,方便后面引用
- 捕获组
- 普通捕获组
- 命名捕获组
1.1捕获组编号规则
编号规则指的是以数字为捕获组进行编号的规则,在普通捕获组或命名捕获组单独出现的正则表达式中,编号规则比较清晰,在普通捕获组与命名捕获组混合出现的正则表达式中,捕获组的编号规则稍显复杂
需要说明的是,存在编号为0的捕获组,指的是正则表达式整体,这一规则在支持捕获组的语言中,基本上都是适用的
1.2.1普通捕获组编号规则
如果没有显式为捕获组命名,即没有使用命名捕获组,那么需要按数字顺序来访问所有捕获组。在只有普通捕获组的情况下,捕获组的编号是按照'('出现的顺序,从左到右,从1开始编号
例如:(\d{4})-(\d{2}-(\d\d)) 匹配年月日
编号 | 命名 | 捕获组 | 匹配内容 |
---|---|---|---|
0 | (\d{4})-(\d{2}-(\d\d)) | 2008-12-31 | |
1 | (\d{4})) | 2008 | |
2 | (\d{2}-(\d\d)) | 12-31 | |
3 | (\d\d) | 31 |
1.2.2命名捕获组编号规则
命名捕获组通过显式命名,可以通过组名方便的访问到指定的组,而不需要一个个的数编号,同时避免了在正则表达式扩展过程中,捕获组的增加或减少对引用结导致的不可控的问题
值得一提的是,命名捕获组也参与了编号,在只有命名捕获组的情况下,捕获组的编号也是按照'('出现的顺序,从左到右,从1开始编号
例如:(?
编号 | 命名 | 捕获组 | 匹配内容 |
---|---|---|---|
0 | (\d{4})-(\d{2}-(\d\d)) | 2008-12-31 | |
1 | year | (? |
2008 |
2 | date | (? |
12-31 |
3 | day | (? |
31 |
1.2.3普通捕获组与命名捕获组混合编号规则
对于命名捕获组,可以随时使用组名进行访问,而对于普通捕获组,只能通过确定其编号后进行访问
编号的顺序:对于两种捕获组混合的正则表达式,首先会忽略命名捕获组,对普通捕获组进行编号,全部完成后,再对命名捕获组进行编号
例如:(\d{4})-(?
编号 | 命名 | 捕获组 | 匹配内容 |
---|---|---|---|
0 | (\d{4})-(? |
2008-12-31 | |
1 | (\d{4}) | 2008 | |
2 | date | (? |
12-31 |
3 | (\d\d) | 31 |
零宽断言
用于查找在某些内容之前或者之后的东西,但是并不包括这些内容
可以理解为匹配位置,该位置满足的条件就是断言
正则表达式中只有当断言为真时才会继续进行匹配
1.零宽度正预测先行断言(?=exp匹配exp前面的位置),它断言自身出现的位置的后面能匹配表达式exp
例如:\b\w+(?=ing\b),匹配以ing结尾的单次的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc
2.零宽度正回顾后发断言(?<=exp),它断言自身出现的位置的前面能匹配表达式exp
例如:(?<=bre)\w+\b会匹配以re开头的单词开头的后半部分(除re以外的部分),如查找reading a book时,它会匹配ading
3.零宽度负预测先行断言(?!exp),它断言此位置的后面不能匹配表达式exp
例如:\d{3}(?!\d)匹配123456, \b((?!abc)\w)+\b匹配abcajsljnnasd ajskldjkaslj vcxjbj jojljklkasabclkajsdlk
4.零宽度负回顾后发断言(?
例如:(?
反向引用
捕获组捕获的数据会放到缓存区中,编号从1开始一直到99,可以使用 \num 来选择性的调用
反向引用的作用通常是用来查找或限定重复、查找或限定指定标识配对出现等等
例如:
表达式:(\w)((?=\1\1\1)(\1))+
字符串:aa bbb cccc ffffff eeeeeeee 999999999
匹配结果为:
cc
ffff
eeeeee
9999999
问题:
(\w)\10 中,末尾的\10代表的是捕获组第10个位置的索引,还是第1个位置的索引
贪婪和非贪婪
影响的是被两次修饰的子表达式的匹配行为。贪婪模式是在整个表达式匹配成功的前提下,尽可能多的匹配;相对的,非贪婪模式就是尽可能少的匹配。
属于贪婪模式的两次,也叫作匹配优先量词,包括:
“{m,n}”、“{m,}”、“?”、“”和“+”
在匹配优先量词后加上“?”,就变成非贪婪模式的两次,也叫做忽略优先量词,包括:
“{m,n}?”、“{m,}?”、“??”、“?”和“+?”
反义
引用
百度百科
https://blog.csdn.net/josjiang1/article/details/80567922