前面章节中我们也提到过分组,正则表达式中利用括号可以实现分组的目的,那么分组和不分组有什么区别呢?
我们通过逐句运行代码时本地窗口的变化来了解下两种情况下正则的区别:
一、不分组的情况:
上面这个案例很简单,把单价提取出来。我们看下本地窗口中红框部分,非常简单,就是代码部分开始声明的几个变量。
二、分组的情况:
这是昨天文章中留给大家思考的案例,代码如下:
当我们运行完 For Each m In mat 时,我们看下本地窗口:
我们发现mat这个对象跟我们的字典类似,有count,代表匹配成功的item项的个数,每个item又有三个属性,firstindex表示匹配成功的Item的起始位置,length代表item的长度,value代表值。
我们看到length下面还有个Submatches,这是个集合,下面同样有count,item,此例中两个item分别是两个分组所匹配的内容。
当正则表达式中有分组时,执行表达式就会产生Submatches集合,利用这个特点我们就可以轻松的把各个分组的内容给提取出来。
本例代码中:
Cells(n 2, 2) = .Replace(m.Value, '$1')
Cells(n 2, 3) = .Replace(m.Value, '$2')
m是每个匹配成功的内容,把每个匹配成功的内容替换成分组的内容。$1,$2是每个分组的值的简写。通过正则测试软件也可看到:
当然我们也可以直接把Submatches的item的值放到相应位置,代码如下:
Sub 提取2()
Dim regx As Object, mat, m, n%
Set regx = CreateObject('vbscript.regexp')
With regx
.Global = True
.Pattern = '(\d )\.?([一-龢] )'
Set mat = .Execute([a1])
For Each m In mat
n = n 1
Cells(n 2, 2) = m.submatches(0)
Cells(n 2, 3) = m.submatches(1)
Next
End With
End Sub
当然红色部分也可以写成:
Cells(n 2, 2) = '$1'
Cells(n 2, 3) = '$2'
经过这样的举一反三以后,我们就知道了m.submatches(0)就可以简写成'$1'。
今天的分享就到这里了!大家可以在留言区进行交流!
觉得不错,请点赞 ↓ ↓ ↓
联系客服