第四章 正则表达式
4.11 零宽断言
正则表达式匹配到一个位置,因为这个位置占用的宽度为零,所以叫零宽度断言,简称零宽断言。
零宽断言有两种格式:
1、(?=xxx) 在XXX前面
例句:(?=abc) 在字母abc的前面
123abc456,用正则表达式\d+(?=abc),就会匹配到在字母abc前面的数字123。
2、(?!xxx) 不在XXX前面
例句:(?![一-龢]) 不在汉字的前面
123和456,用正则表达式\d+(?![一-龢])匹配,就会匹配到12、456两个结果,汉字前面的3不会匹配到。
正则表达式变为\d+(?![一-龢])$,就会只匹配到456了。
小程序:
把下表中的姓名和联系方式筛选出来。
钱大6498316,学生 |
赵二5678346,个体工商户 |
王小虎2395799,老师 |
李三4466782自由职业者 |
Sub 零宽断言()
Dim reg As New RegExp
With reg
.Global = True
.Pattern = "([一-龢]+(?=\d))(\d+)"
For Each ss In Range("a1:a4")
ss.offset(0, 1) = .Execute(ss)(0).SubMatches(0)
ss.offset(0, 2) = .Execute(ss)(0).SubMatches(1)
Next
End With
End Sub
在([一-龢]+(?=\d))(\d+)这个正则表达式里,我们用零宽断言(?=\d),定位位于数字前面的汉字来提取名字,用第二个分组来提取联系方式。每一行匹配到一个记录,两个分组:
程序运行后得到的结果如下:
姓名 | 联系方式 | |
钱大6498316,学生 | 钱大 | 6498316 |
赵二5678346,个体工商户 | 赵二 | 5678346 |
王小虎2395799,老师 | 王小虎 | 2395799 |
李三4466782自由职业者 | 李三 | 4466782 |
这个案例也可以用首尾匹配的方式,匹配位于行首的汉字来提取名字。在实际应用中,正则表达式可以多种方式灵活运用,哪种快捷简便就优先使用哪种。
往期精彩回顾:
学习VBA,报表做到飞 第四章 正则表达式 4.10 贪婪模式与懒惰模式
学习VBA,报表做到飞 第四章 正则表达式 4.9 后向引用
学习VBA,报表做到飞 第四章 正则表达式 4.8 分组匹配
我是云飞扬,职场财会人员,愿与大家分享表格制作和数据统计分析的技巧与方法,希望大家的工作更便捷,更轻松!