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

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)) 匹配年月日

普通捕获组.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开始编号
例如:(?\d{4})-(?\d{2}-(?\d\d)) 匹配年月日

命名捕获组.png

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

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


混合捕获组.png
编号 命名 捕获组 匹配内容
0 (\d{4})-(?\d{2}-(\d\d)) 2008-12-31
1 (\d{4}) 2008
2 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.零宽度负回顾后发断言(?

例如:(?

反向引用

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

你可能感兴趣的:(正则表达式--匹配提取的利器)