正则表达式中的后向引用
Posted 鹏哥工作室之office
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式中的后向引用相关的知识,希望对你有一定的参考价值。
在介绍后向引用之前我们先来看一个案例:
上面的例子中要求把在职日期中年份相同的数据对应的姓名筛选出来,第一步,我们先要找出在职日期中年份相同的数据。
我们看下正则表达式该怎么写?
Pattern = "\d{4}",这样可以把连在一起的四位数字给匹配出来。
Pattern = "\d{4}.+",这样可以把四位数字和后面的所有内容给匹配出来。
Pattern = "\d{4}.+\d{4}.+",这样写就相当于是两个"\d{4}.+"合在一起,前面一个可以认为是第一个年份数字到下个年份数字前的所有内容,后面一个当然就是剩下的部分。
我们可以通过匹配到的值来看下效果:
代码如下:
Sub 筛选()
Dim regx As Object, rng As Range, mat, m
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = "\d{4}.+\d{4}.+"
For Each rng In [b2:b9]
Set mat = .Execute(rng)
For Each m In mat
Next
Next
End With
End Sub
效果如下:(观察m值的变化)
表达式 "\d{4}.+\d{4}.+"和"\d{4}.+"其实没啥区别,都可以把所有内容匹配出来。
但是,当我们把表达式"\d{4}.+\d{4}.+"修改下:
"(\d{4}).+\1.+",
大家看下两个表达式之间的区别,对"\d{4}"进行了分组,同时后面的相同部分改成了1,1代表引用了表达式中第一个括号里的内容,如果表达式中有多个括号,那么数字写几就代表引用第几个括号里的内容,这就是所谓的后向引用。
用数字来表达引用前面分组中的部分,及前面分组中匹配到的内容要被后面引用。
我们看下修改后的效果:
代码如下:
Sub 筛选()
Dim regx As Object, rng As Range, mat, m
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = "(\d{4}).+\1.+"
For Each rng In [b2:b9]
Set mat = .Execute(rng)
For Each m In mat
Next
Next
End With
End Sub
效果如下:
通过以上的例子,我们就清楚了什么是后向引用,文章开始的案例的代码如下:
Sub 筛选1()
Dim regx As Object, rng As Range, n%
Set regx = CreateObject("vbscript.regexp")
With regx
.Global = True
.Pattern = "(\d{4}).+\1.+"
For Each rng In [b2:b9]
If .test(rng) Then
n = n + 1
Cells(n + 1, 4) = Cells(rng.Row, 1)
End If
Next
End With
End Sub
这里要注意的另外一个重要内容:
If .test(rng) Then,表示假如表达式匹配成功时……
后向引用是在分组的基础上的一个延续。
在 "(\d{4}).+\1.+"中,每匹配到一个"(\d{4})",都会形成一个组用以保存记录,方便后面引用,所以会占用一定的内存,这种叫做捕获分组,只要分了组,运行代码时都会产生组记录。
那如果我们不需要捕获,不做后向引用,只是单纯的匹配呢?
那就用(?:pattern)这种语法。
比如:"(?:\d{4}),这样的表达式在运行时就不会产生组记录。
今天的分享就到这里了!
后台回复下列红色关键词可以获取相关资源:
1、office365, office 365, 365,可以获取office365版本
2、excel学习, Excel学习,可以获取相关的学习资料
3、VBA学习,可以获取相关的学习资料
4、excel扩展,可以获取excel扩展工具,能让excel更加高效方便的工作
5、百度云破解限速,可以获取相关软件
6、PPT模板, ppt模板,可以获取相关资源
7、快查手册,可以获取函数快查手册
8、微信清粉, 清粉,可以获取微信僵尸粉清理软件
注意是后台回复,不是留言区回复,而且回复的关键字必须跟上面的关键字一样,注意大小写,空格之类。
长按识别下方二维码关注,
后台菜单中有更多精彩内容等着你!
苹果用户可通过下方二维码赞赏!
觉得不错请点赞!!!
以上是关于正则表达式中的后向引用的主要内容,如果未能解决你的问题,请参考以下文章