相关文章推荐
无邪的灯泡  ·  Python中KeyError: ...·  9 月前    · 
淡定的鸭蛋  ·  Python ...·  1 年前    · 
VBA学习笔记38:正则表达式2

VBA学习笔记38:正则表达式2

3 年前 · 来自专栏 VBA学习笔记(完结)

学习资源:《Excel VBA从入门到进阶》第38集 by兰色幻想


正则表达式的核心是设置对比的规则,也就是设置Pattern属性,而组成这些规则除了字符本身以外,是具有特定含义的符号。

下面介绍的是正则表达式中常用符号的第一部分。


  1. “ \ ”号

(1)放在不便书写的字符前面,如换行符(\r),回车符(\n),制表符(\t),\自身(\\)

(2)放在有特殊意义字符的前面,表示它自身,"\$","\^","\."

(3)放在可以匹配多个字符的前面

\d 数字,0~9

\w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9中任意一个

\s 包括空格、制表符、换页符等空白字符的其中任意一个

以上改为大写时,为相反的意思,如\D 表示非数字类型。

例:把字符串"AE45B646C"中的字母(非数字)换成“ * ”。

Sub t1()
Dim regx As New RegExp
Dim sr
sr = "AE45B646C"
With regx
    .Global = True
    .Pattern = "\D" '排除非数字
    Debug.Print .Replace(sr, "*")
End With
End Sub


2. “ . ”(点)

可以匹配除换行符以外的所有字符。

例:把字符串"A234CA7A"中的字母“A”及它后面的字符删除。

Sub t111()
Dim regx As New RegExp
Dim sr
sr = "A234CA7A"
With regx
    .Global = True
    .Pattern = "A."               '查找:字母“A”及其后面带有一个字符的
Debug.Print .Replace(sr, "")      '""双引号中不含任何内容,表示
End With
End Sub
最后一个A后面没有字符了,不符合条件,所以没被替换


3. “+”号

+表示一个字符可以有任意多个重复的。

例:把字符串"A234CA7A"中的字母“A”及其后面至少有一个数字删除。

Sub t11()
Dim regx As New RegExp
Dim sr
sr = "A234CA7A"
With regx
    .Global = True
    .Pattern = "A\d+"               '查找:A及其后面至少有一个数字
Debug.Print .Replace(sr, "")
End With
End Sub


4. “{}”号

可设置重复次数。

① {n} 表示重复n次

例:删除字符串"A234CA7A"中连续两个都是数字的字符。

Sub t16()
Dim regx As New RegExp
Dim sr
sr = "A234CA7A67"
With regx
    .Global = True
    .Pattern = "\d{2}"            '查找:连续两个数字
    Debug.Print .Replace(sr, "")
End With
End Sub


② {m,n} 最小重复m次,最多重复n次。

例:把字符串"A234CA7A"中连续两或三个都是数字的字符换成“*”号。

Sub t22()
Dim regx As New RegExp
Dim sr
sr = "A2345CA7A6789"
With regx
    .Global = True
    .Pattern = "\d{2,3}"             '查找:连续两或三个字符都是数字的
    Debug.Print .Replace(sr, "*")
End With
End Sub


③{m,} 最少重复m次,相当于+

例:把字符串"A234CA7A"中连续两或三个都是数字的字符换成“*”号。

Sub t23()
Dim regx As New RegExp
Dim sr
sr = "A2348t6CA7A67"
With regx
    .Global = True
    .Pattern = "\d{2,}"            '查找:连续两个或以上字符都是数字的
    Debug.Print .Replace(sr, "*")
End With
End Sub


5. "*"号和"?"号

①表示出现0或任意次,相当于 {0,},比如:"\^*b"可以匹配 "b","^^^b"...

(复习:“\^”表示“^”本身,如只有“^”,表示要查找首字符,"^b"查找首字符是否为b)

或者用“?”,匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

例:把字符串 "A23.48CA7A6..7" 中数字后面带有1-2个"." 的字符换成空""。

Sub t24()
Dim regx As New RegExp
Dim sr
sr = "A23.48CA7A6..7"
With regx
    .Global = True
    .Pattern = "\d+\.{1,2}"        '查找:数字及其后面带有1-2个"." 的字符串
    Debug.Print .Replace(sr, "")
End With
End Sub


②利用"?"进行分段匹配

例:把字符串 " aba aca ada " 中以空格分段显示。

Sub t88()
Dim regex As New RegExp
Dim sr, mat, m
sr = " aba  aca  ada "
With regex
    .Global = True
    .Pattern = "\s.+?\s"         '查找:空格后跟着任意字符再跟着空格,只匹配一次,分段,再查找
                                 '把"+"改用".*",“.Pattern = "\s.*?\s" ”也能达到同样效果。
                                 '"*"和"+"都可匹配任意个。
    Set mat = .Execute(sr)       '查找符合条件的字符串并返回到集合mat。
    For Each m In mat            '循环提取