相关知识点:
环视(Look Around)或译为“零宽度断言”,代表的不是字符,代表文本中一个位置。比如(?=abc)代表字符串中一个位置,该位置右边必须是“abc”。
(?=北京|$)可匹配这样一个位置:其中右边或者是“北京”,或者是行尾,|代表或者,$代表在多行模式下代表一行末尾。
环视的四种形式:
例1 北京车站分别显示在一列中。
Sub lookrounddemo()
Dim reg as Object, matches as Object
Dim i as long, s as String
‘从A1单元格读入待分析的原文本
s=cells(1,1)
‘创建并设置正则表达式对象,Multiline为True代表“多行模式”
‘在这种模式下,可以用$符号代表每一行的结尾
Set reg=CreateObject(“vbscript.regexp”)
reg.Global=True
reg.MulitiLine=True\
‘设计正则表达式
‘reg.Pattern=” 北京\S+北京” ‘\S:非空白字符(\s相反),贪婪搜索原则
‘实际结果是:北京西北京站北京北北京南站北京,少了一个东字
‘reg.Pattern=” 北京\S+?北京” ‘在+*等各种量词后面再写一个?,
‘代表执行“懒惰搜索”,匹配尽可能少的字符,
‘结果:北京西北京,北京北北京
‘北京西北京站北京北北京南站北京东
‘reg.Pattern=” 北京[^北]+” ‘查找北京后不含(取反不能用是字符串)北的字符串,结果没有北京北
reg.Pattern=” 北京\S+?(?=北京|$)” ‘(?=北京)环视功能
‘执行正则表达式,并将匹配出的结果依次写在A列各行
Set matches=reg.Execute(s)
For i=0 To matches.Count -1
Cells(i+2,1)=matches(i).Value
Next i
End Sub
例2 列表本地号码,不要区号
Sub lookrounddemo1()
Dim reg as Object, matches as Object
Dim i as long, s as String
‘从A1单元格读入待分析的原文本
s=cells(1,1)
‘创建并设置正则表达式对象,Multiline为True代表“多行模式”
‘在这种模式下,可以用$符号代表每一行的结尾
Set reg=CreateObject(“vbscript.regexp”)
reg.Global=True
reg.MulitiLine=True\
‘设计正则表达式
‘reg.Pattern=” \d+(?!\d|-)”
‘执行正则表达式,并将匹配出的结果依次写在A列各行
Set matches=reg.Execute(s)
For i=0 To matches.Count -1
Cells(i+2,1)=matches(i).Value
Next i
End Sub
例3 用split 拆分字符串方法,列表北京站名
Sub splitdemo()
Dim a() as string, i as long, s
a=split(Range(“a1”.value,”北京”))
i=2
For Each s In a
If s<>”” Then
Cells(i,1)=”北京” & s
i=i+1
End if
Next s
End Sub