第四章 正则表达式 4.11 零宽断言 正则表达式匹配到一个位置,因为这个位置占用的宽度为零,所以叫零宽度断言,简称零宽断言。 零宽断言有两种格式: 1、(?=xxx) 在XXX前面 例句:(?=abc) 在字母abc的前面 123abc456,用正则表达式\d+(?=abc),就会匹配到在字母abc前面的数字123。 ![]() 2、(?!xxx) 不在XXX前面 例句:(?![一-龢]) 不在汉字的前面 123和456,用正则表达式\d+(?![一-龢])匹配,就会匹配到12、456两个结果,汉字前面的3不会匹配到。 ![]() 正则表达式变为\d+(?![一-龢])$,就会只匹配到456了。 ![]() 小程序: 把下表中的姓名和联系方式筛选出来。
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),定位位于数字前面的汉字来提取名字,用第二个分组来提取联系方式。每一行匹配到一个记录,两个分组: ![]() 程序运行后得到的结果如下:
这个案例也可以用首尾匹配的方式,匹配位于行首的汉字来提取名字。在实际应用中,正则表达式可以多种方式灵活运用,哪种快捷简便就优先使用哪种。 |
|