实例需求:由网页中提取下图中颜色标记部分内容,网页中其他部分与此三行格式相同。
方法1
Sub Demo()
Dim objRegex As Object
Dim inputString As String
Dim objMatches As Object
Dim objMatch As Object
Set objRegex = CreateObject("VBScript.RegExp")
objRegex.Pattern = "id=[^>]+|[^>]+&#[^<]+"
objRegex.Global = True
inputString = Cells(1,1).Value
Set objMatches = objRegex.Execute(inputString)
For Each objMatch In objMatches
Debug.Print objMatch
Next objMatch
End Sub
【代码解析】
第6行代码创建正则对象。
第7行代码设置正则匹配模式。
正则表达式 | 说明 |
---|---|
id=[^>]+ | 匹配以id= 开头,后面跟一个或者多个除> 之外的任意字符 |
[^>]+&#[^<]+ | 匹配以一个或者多个除> 之外的任意字符开头,后面为&# ,之后为一个或者多个除< 之外的任意字符 |
第8行代码设置正则全局匹配。
第9~11行代码将待处理字符串保存在变量中。
第12行代码执行正则匹配。
第13~15行代码循环遍历匹配结果,第14行代码输出到立即窗口,结果如下图所示。
方法2
使用常规正则匹配模式,此正则模式比较容易理解,不再讲解其含义。
方法1中灵活使用了字符集[^……]
,限制非某字符,也就实现了以该字符为边界的效果,其匹配模式字符串更简洁。
Sub Demo2()
Dim objRegex As Object
Dim inputString As String
Dim objMatches As Object
Dim objMatch As Object
Set objRegex = CreateObject("VBScript.RegExp")
objRegex.Pattern = "(id=""[^""]+"").*?<text.*?>(.*?)<\/text>"
objRegex.Global = True
inputString = Cells(1,1).Value
Set objMatches = objRegex.Execute(inputString)
For Each objMatch In objMatches
Debug.Print "ID: " & objMatch.SubMatches(0)
Debug.Print "Text: " & objMatch.SubMatches(1)
Debug.Print "----------------"
Next objMatch
End Sub
示例数据
<g class="node" transform="translate(1980, 861.0625)" id="node-946327"><rect width="120" height="36" transform="translate(-60,-18)" rx="18" ry="18" stroke="darkseagreen" stroke-width="2" style="fill: rgb(255, 255, 255);"></rect><circle r="18" transform="translate(-42,0)" style="fill: url("#image-person-old");"></circle><text transform="translate(18,0)" y="4" text-anchor="middle" style="fill-opacity: 1; font: 12px sans-serif;">Байтайлақ</text><text transform="translate(18,0)" y="10" text-anchor="middle" style="fill-opacity: 1; font: 8px sans-serif;"></text></g>
<g class="node" transform="translate(1980, 907.0625)" id="node-946328"><rect width="120" height="36" transform="translate(-60,-18)" rx="18" ry="18" stroke="darkseagreen" stroke-width="2" style="fill: rgb(255, 255, 255);"></rect><circle r="18" transform="translate(-42,0)" style="fill: url("#image-person-old");"></circle><text transform="translate(18,0)" y="4" text-anchor="middle" style="fill-opacity: 1; font: 12px sans-serif;">Байтоғай</text><text transform="translate(18,0)" y="10" text-anchor="middle" style="fill-opacity: 1; font: 8px sans-serif;"></text></g>
<g class="node" transform="translate(1980, 953.0625)" id="node-946329"><rect width="120" height="36" transform="translate(-60,-18)" rx="18" ry="18" stroke="darkseagreen" stroke-width="2" style="fill: rgb(255, 255, 255);"></rect><circle r="18" transform="translate(-42,0)" style="fill: url("#image-person-old");"></circle><text transform="translate(18,0)" y="4" text-anchor="middle" style="fill-opacity: 1; font: 12px sans-serif;">Оразәлі</text><text transform="translate(18,0)" y="10" text-anchor="middle" style="fill-opacity: 1; font: 8px sans-serif;"></text></g>