|
楼主 |
发表于 2018-12-8 00:50
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
7.正则表达式
据说正则表达式(Regular Expression)源于神经生物科学家,想想也是挺神奇的事。正则表达式绝对是匹配字符串的王者,很复杂的查询条件,都能写在一个模式匹配里面。匹配某类字符串或某种字符串组织规则时,正则表达式尤为好用。通过给定一个正则表达式和另一个字符串,可以实现两个目的:
1. 给定的字符串是否符合正则表达式的模式串(pattern),符合就叫匹配,不符合就不匹配;
2.通过正则表达式,可以从字符串中获取、修改和删除特定部分的字符串、增加特定字符串。
正则表达式由普通字符和元字符组成。普通字符包括大小写字母、数字、下划线或汉字等,而元字符是事先规定的符号,具有特殊的含义,了解了元字符的含义,正则表达式基本上就入门了。下面的元字符是我从网上复制的, VBA的正则表达式不支持其中的少量元字符,比如预查貌似就不支持,使用时加以区分即可。
一些例子:
1.电话号码:("^(\d{3,4}-)\d{7,8}$")格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
2.手机号码:"^1[3|4|5|7|8][0-9]{9}$";
正则表达式对象只有Replace、Test和Execute三个方法,Pattern、Global、Ignorecase和Multiline四个属性和Matches集合,半个小时就能搞清楚个大概,本论坛有很多正则表达式的教程,这里不再赘叙。
为实现2.1节相同的查询结果,可用代码:
Sub 查询10()
Dim arr, brr, i&, j&, k&, reg As Object
Application.ScreenUpdating = False
arr = Worksheets("数据库").Range("a1").CurrentRegion
ReDim brr(1 To UBound(arr, 1), 1 To UBound(arr, 2))
For i = 1 To UBound(arr, 2): brr(1, i) = arr(1, i): Next '存储原标题
j = 2
Set reg = CreateObject("vbscript.regexp") '创建正则表达式对象
reg.Pattern = "和目1" '匹配模式,正则表达式的核心所在,多练习才能掌握
For i = 2 To UBound(arr) '查询条件,用正则表达式匹配
If reg.test(arr(i, 2)) = True And arr(i, 3) = "流量套餐2" And arr(i, 4) = "放心用5" Then
For k = 1 To UBound(arr, 2): brr(j, k) = arr(i, k): Next
j = j + 1
End If
Next
With Worksheets("结果集")
.UsedRange.ClearContents
.Range("a1").Resize(UBound(brr, 1), UBound(brr, 2)) = brr
End With
Set reg = Nothing
Application.ScreenUpdating = True
End Sub
这样看,貌似正则表达式也没什么特殊表现。我们假如要查询手机号最后一位数字是8,倒数第二、三位数字是3、6、9中的数字,用正则表达式就能体现优势了,只需要reg.Pattern = "[369]{2}8$",对手机号码字段进行匹配即可:
Sub 查询11()
Dim arr, brr, i&, j&, k&, reg As Object
Application.ScreenUpdating = False
arr = Worksheets("数据库").Range("a1").CurrentRegion
ReDim brr(1 To UBound(arr, 1), 1 To UBound(arr, 2))
For i = 1 To UBound(arr, 2): brr(1, i) = arr(1, i): Next
j = 2
Set reg = CreateObject("vbscript.regexp")
reg.Pattern = "[369]{2}8$"
For i = 2 To UBound(arr)
If reg.test(arr(i, 1)) Then
For k = 1 To UBound(arr, 2): brr(j, k) = arr(i, k): Next
j = j + 1
End If
Next
With Worksheets("结果集")
.UsedRange.ClearContents
.Range("a1").Resize(UBound(brr, 1), UBound(brr, 2)) = brr
End With
Set reg = Nothing
Application.ScreenUpdating = True
End Sub
|
|