概述
一、正则支持
- 正则的概念就不说了,就是用特殊的字符串进行字符串的匹配
- vba 本身是不支持正则的,需要引入外部的支持
二、基本用法
1、示例代码
Sub text()
Dim reg As New RegExp
sr = "ABCA"
Dim ret
With reg
.Global = True
.Pattern = "A"
.MultiLine = True
Set ret = .Execute(sr)
End With
For Each r In ret
Debug.Print r
Next r
End Sub
2、细节说明
- 创建正则对象还可以通过
createObject("vbscript.regexp")
Global
属性代表是否进行全局匹配,false 的话就返回匹配的第一个,true的话会搜索全部的字符multiline
是设置是否进行多行的匹配,存在换行符的时候可以使用Pattern
是最核心的设置我们的匹配的规则ignoreCase
属性可以设置是否区分大小写- 最后的
Execute
方法可以返回匹配的结果集合,结果集包含的信息包括firstIndex、length、value - 如果采用
test
方法的话返回的就是true 或者false - 结果集可以使用
for
进行遍历输出
特殊符号
一、\
- 换行符、制表符等中使用:
\r \n \t
- 用来转义使用:
\$ \.
- 特殊意义符号使用,大写的时候表示非
\d--匹配数字
\w--匹配数字或字母
\s--匹配空格、制表符等
二、.
- 匹配除换行符以外的任意字符
三、+ * ?
?
代表出现0次或者1次*
代表0、1、无数+
代表至少一次
四、{}
- {n}
- {n,m}
- {n,}
1、正则对象的
replace(sr," ")
方法是将匹配的内容进行置换,所以只有两个参数
2、.*
匹配所有是贪婪模式,是尽可能多进行匹配.*?
是比较合理的通用匹配方式
五、[]
- 匹配一个:
[ABC]
- 非括号内容:
[^a]
- 范围匹配:
[a-z]
六、()
- 括号内的内容作为一个整体
\num
可以进行括号内容的引用,具体的后面的数字匹配的顺序是前后外内
Sub test()
Dim reg As New RegExp
Dim sr As String
sr = "A2A2B4B4QB41133AA33"
With reg
.Global = True
.MultiLine = True
.Pattern = "((A2){2})((B4){2})Q\4"
Debug.Print .Replace(sr, "")
End With
End Sub
'output:1133AA33
(?=str) (?!str)
都可以进行预搜索,特点就是仅仅进行判断,不会占用匹配的位置
Sub test()
Dim reg As New RegExp
Dim sr As String
sr = "100元50元30元"
Dim ret
With reg
.Global = True
.Pattern = "(?=.*元)\d+"
'.Pattern = "\d+(?=元)"
Set ret = .Execute(sr)
End With
For Each r In ret
Debug.Print r
Next r
End Sub
Sub test()
Dim reg As New RegExp
Dim sr As String
sr = "Aaaa9"
Dim ret
With reg
.Global = True
.Pattern = "^(?=.*\d).{4,8}$"
Set ret = .Execute(sr)
End With
For Each r In ret
Debug.Print r
Next r
End Sub
()
和|
联合使用主要用来简化我们的书写:A\d+|B\d+
和(A|B)\d+
效果相同
七、^ $
- 就是首尾匹配
八、\b
- 单词边界的匹配
九、|
- 就是一个或者的逻辑:
A\d+|B\d+
和(A|B)\d+
效果相同,A|B\d+
和前二者不同
十、\un
- 就是unicode 的表示,n为4位16进制,主要的应用就是汉字的筛选
- 汉字的 unicode 编码是
4e00
到9fa5
提取我们要的字符串的时候一般2种方法:要么直接匹配我们要的字符串,要么将我们不要的给剔除