正则表达式--匹配提取的利器

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<name>) 表示分组起别名
?P=name 表示引用别名为name分组匹配到的字符串
(分组数据) 分组数据是从左到右的方式进行分配的,最左边的是第一个分组,以此类推

捕获和非捕获

捕获实际上就是正则匹配,但是经常和分组一起使用,所以也叫捕获组和非捕获组

1.捕获组

捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显示命名的组里,方便后面引用

  • 捕获组
    • 普通捕获组
    • 命名捕获组
1.1捕获组编号规则

编号规则指的是以数字为捕获组进行编号的规则,在普通捕获组或命名捕获组单独出现的正则表达式中,编号规则比较清晰,在普通捕获组与命名捕获组混合出现的正则表达式中,捕获组的编号规则稍显复杂
需要说明的是,存在编号为0的捕获组,指的是正则表达式整体,这一规则在支持捕获组的语言中,基本上都是适用的

1.2.1普通捕获组编号规则

如果没有显式为捕获组命名,即没有使用命名捕获组,那么需要按数字顺序来访问所有捕获组。在只有普通捕获组的情况下,捕获组的编号是按照'('出现的顺序,从左到右,从1开始编号
例如:(\d{4})-(\d{2}-(\d\d)) 匹配年月日

普通捕获组.png

编号 命名 捕获组 匹配内容
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开始编号
例如:(?<year>\d{4})-(?<date>\d{2}-(?<day>\d\d)) 匹配年月日

命名捕获组.png

编号 命名 捕获组 匹配内容
0 (\d{4})-(\d{2}-(\d\d)) 2008-12-31
1 year (?<year>\d{4}) 2008
2 date (?<date>\d{2}-(?<day>\d\d))) 12-31
3 day (?<day>\d\d) 31
1.2.3普通捕获组与命名捕获组混合编号规则

对于命名捕获组,可以随时使用组名进行访问,而对于普通捕获组,只能通过确定其编号后进行访问
编号的顺序:对于两种捕获组混合的正则表达式,首先会忽略命名捕获组,对普通捕获组进行编号,全部完成后,再对命名捕获组进行编号
例如:(\d{4})-(?<date>\d{2}-(\d\d))


混合捕获组.png
编号 命名 捕获组 匹配内容
0 (\d{4})-(?<date>\d{2}-(\d\d)) 2008-12-31
1 (\d{4}) 2008
2 date (?<date>\d{2}-(\d\d)) 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.零宽度负回顾后发断言(?<!exp),它来断言此位置的前面不能匹配表达式exp

例如:(?<![a-z])\d{7}匹配 sjdlkjdslkfaj12345671alkjsdljalk,7位数字前必须非小写字母

反向引用

捕获组捕获的数据会放到缓存区中,编号从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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • .价格亲民 短视频带货属于感官刺激下的冲动式消费,因为用户刷抖音最大的目的是获得快乐、获取信息,而不是为了购物。 ...
    来呀呀阅读 1,319评论 0 0
  • 《香帅中国财富报告》 14丨2020年,中国的房子还能买吗?怎么买? 1、 从这一讲开始,我们进入报告的第三部分—...
    六安姐阅读 2,833评论 0 0
  • 【前言】:每天用你最喜欢的方式做你最喜欢的事情,这是一种莫大的幸福,然后,每天重复这种快乐的做事方式和做事心情,久...
    币圈监察者阅读 903评论 0 0
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 9,764评论 0 13
  • 感觉自己有点神经衰弱,总是觉得手机响了;屋外有人走过;每次妈妈不声不响的进房间突然跟我说话,我都会被吓得半死!一整...
    章鱼的拥抱阅读 6,540评论 4 5