正则表达式之——捕获(capture group)和反向引用

一、分组:

正则表达式中的分组又称为子表达式,就是把一个正则表达式的全部或部分当做一个整体进行处理,分成一个或多个组。其中分组是使用“()”表示的。进行分组之后“()”里面的内容就会被当成一个整体来处理。

示例:

(Matz|Eich) //匹配Matz或Eich
(Matz)? //匹配0或1个Matz

分组又可以分为捕获组 和 非捕获组两种。

1、捕获组(capture group):

捕获组:就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,这种引用方式就是反向引用(下面会讲)

捕获组编号规则:

从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。需要注意的是组0永远代表的是整个正则式。

2、非捕获组:

1)为什么要有非捕获组:

一旦使用了“()”,就会默认为是捕获组,从而将“()”内表达式匹配的内容捕获到组里。但是有些情况下,不得不用“()”,但并不关心“()”中匹配的内容是什么,后面也不会引用捕获到的内容,这带来了一个副作用,记录这些捕获组就会占用内存,降低匹配效率。设计非捕获组的目的就是为了抵消这种副作用。 只进行分组,并不将子表达式匹配到的内容捕获到组里。

2)使用:

以 (?) 开头的组是非捕获组,它不捕获文本 也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在反向引用。

使用上,主要是先行断言和后行断言。详情见:https://blog.csdn.net/liuxiao723846/article/details/83278067

二、反向引用:

当一个正则表达式被分组后,每个组将会自动的分配一个组号用于代表该组的表达式,其中,组号的编制规则为:从左到右、以分组的左括号“(”为标志,第一个分组的组号为1,第二个分组的组号为2,以此类推。反向引用提供查找重复字符组的方便的方法。它们可被认为是再次匹配同一个字符串的快捷指令

示例1:

(boy)\1          //相当于(boy)(boy),匹配boyboy
(boy)(girl)\1\2  //匹配boygirlboygirl

示例2:

对比(\w)\1和的区别:
(\w)\1    //该正则匹配的是出现两次的字符,\1将重复匹配(\w)出现的内容!例如匹配aa、bb
(\w)(\w)  //该正则只是简单的匹配两个字符,例如匹配ab,aa等。注意区别!


 

 

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值