第四章 正则表达式
4.9 后向引用
正则表达式有括号()分组时,如果在分组匹配内容的后面,再匹配相同内容,可以用\1或者\n代表引用第一个括号内的内容或第n个括号内的内容,这就是后向引用。
说白了,也就是在一个字符串里找到两个相同的内容。如:
VBA是Visual Basic For Application的简称,是一种内置在Excel中的编程语言,可以用来编写程序代码,实现一些Excel本身所不具备的功能。
我们在这句话里匹配两个“Excel”,用正则表达式"([A-Z][a-z]+).+\1",把需要匹配两次的内容用小括号括起来,中间部分用.+表示,后面的\1表示再次匹配前面小括号里的内容,就会匹配到如下结果:
匹配到一个记录“Excel中的编程语言,可以用来编写程序代码,实现一些Excel”,其中有一个匹配组“Excel”。
如果前面有两个小括号,也就是说有两个分组匹配,我们想匹配第二个小括号里的内容,这时就用\2表示,依次类推。
用后向引用来查找字符串中的重复内容最方便,下面我们通过一个案例来说明它的用法。
小程序:
把下面句子里的重复词语用红色标注出来。
VBAVBA是Visual Basic For Application的简称,是一种内置在ExcelExcel中的编程语言,可以用来编写编写程序代码,实现一些一些Excel本身所不具备的功能。
Sub 后向引用()
Dim reg As New RegExp
With reg
.Global = True
.Pattern = "(.{2,})\1"
Set 结果 = .Execute([a1])
For Each ss In 结果
起点 = ss.FirstIndex + 1
长度 = ss.Length
Range("a1").Characters(起点, 长度).Font.Color = 255
Next
End With
End Sub
在这个程序里,我们用正则表达式"(.{2,})\1"来匹配两个以上的字符串,且紧接着有相同内容的部分,就会找到重复词语。用正则表达式测试工具匹配的结果是:
匹配到4个记录,分别是“VBAVBA”、“ExcelExcel”、“编写编写”、“一些一些”,每一个匹配记录下都有一个匹配组,分别是“VBA”、“Excel”、“编写”、“一些”。
程序运行结果如下:
或者直接把重复部分去掉:
Sub 后向引用()
Dim reg As New RegExp
With reg
.Global = True
.Pattern = "(.{2,})\1"
[a1] = .replace([a1], "$1")
End With
End Sub
在Replace方法里,如果是分组匹配,可以用$1表示第一个匹配组,$2表示第二个匹配组,依此类推。如:
.replace(字符串, "$1") 把匹配结果用第一个匹配组代替。本案例就是用第一个匹配组把匹配到的内容替换掉。运行结果如下:
往期精彩回顾:
学习VBA,报表做到飞 第四章 正则表达式 4.8 分组匹配
学习VBA,报表做到飞 第四章 正则表达式 4.7 首尾匹配
学习VBA,报表做到飞 第四章 正则表达式 4.6 排除匹配
我是云飞扬,职场财会人员,愿与大家分享表格制作和数据统计分析的技巧与方法,希望大家的工作更便捷,更轻松!