分组
之前有提到过,量词能限定之前元素的出现,这个元素可能是一个字符,也可能是一个字符组,还可能是一个表达式---如果把一个表达式用括号包围起来,这个元素就是括号里的表达式。
括号内的表达式通常被成为“子表达式”。
1 2 |
//身份证号码 ^[1-9]\d{14}(\d{2}[0-9x])?$ |
括号的这种功能,叫做分组。
如果用量词限定出现次数的元素不是字符或字符组,而是连续的几个字符甚至是表达式,就应该用括号将他们“编为一组”。
多选结构
多选结构的形式是(...|...)这样的。
在括号内以竖线分隔开多个子表达式,这些子表达式也叫,多选分支。
多选分支的数目没有限定。
在匹配时,整个多选结构被视为单个元素,只要其中某个表达式能够匹配,整个多选结构的匹配就能成功。
引用分组
使用括号之后,正则表达式会保存每个分支真正匹配的文本,等到匹配完成后,通过group(num)之类的方法”引用“分组在匹配时捕获的内容。
num从1开始计数。
这种功能叫捕获分组,对应的括号叫捕获型括号。
反向引用
在表达式内部引用之前的捕获分组匹配的文本(也就是左侧)。
形式是\num,num表示分组的编号。
1 2 |
//查找连续重叠的字母 ^([a-z])\1$ |
需要注意的是:
反向引用重复的是对应捕获分组匹配的文本,而不是之前的表达式;
也就是说,反向引用是一种”引用“,对应的是由之前表达式决定的具体的文本,它本身并不规定文本的特征。
1 2 3 4 5 |
//匹配IP地址 ((0{0,2}[\d]|0?[\d]{2}|1[\d][\d]|2[0-4][\d]|25[0-5])\.){3}(0{0,2}[\d]|0?[\d]{2}|1[\d][\d]|2[0-4][\d]|25[0-5]) //分开 segment = r"(0{0,2}[\d]|0?[\d]{2}|1[\d][\d]|2[0-4][\d]|25[0-5])" ipaddress = r"(" + segment + r"\.){3}" + segment |
命名分组
1 2 |
2010 - 12 - 22 (?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2}) |
非捕获型分组
到目前为止,接触到的括号有三种用途:
- 分组
- 多选结构
- 引用分组
这三种用途是相互重叠的:只要出现了括号,正则表达式在匹配时就会把括号内的子表达式存储起来,提供引用。如果用不到这些内容,那么无疑,这些东西会影响到正则表达式的性能。
为了解决这个问题:
正则表达式提供了非捕获型分组:
非捕获型分组,类似于普通的捕获分组,只是在开括号后紧跟一个问号和冒号,形如(?:...),这样的括号叫非捕获型括号。
它只能限定量词的作用范围,不捕获任何文本。
1 |
(?:\d{4})-(\d{2})-(\d{2}) |
转义的补充
需要注意:
与括号有关的3个元字符【()|】,都必须转义
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Deelx正则表达式语法12/23
- ♥ 正则表达式 _ 量词01/14
- ♥ 正则表达式_匹配模式02/24
- ♥ Graphviz 相关记述10/13
- ♥ 【华东师大版七年级上册】02/26
- ♥ 大话数据结构_线性表_单链表11/01