"(人民币大写:)(\d+\.[0-9]{1,3})" ' 正则表达式,分为二组( )
Sub 测试()
Dim my_str$, mt, mh, sub_str$
Set reg = CreateObject("vbscript.regexp") '定义一个正则对象
my_str = "我人民币大写:123656.00。小写:123654.03 " & _
"中介人民币大写:800.36公司日丰人民币大写:36659.32.日韩地晶上 "
With reg
.Pattern = "(人民币大写:)(\d+\.[0-9]{1,3})" '正则表达式
.Global = True '匹配出所有符合条件的字符
.IgnoreCase = False '不忽略大小写
.MultiLine = True '多行模式
Set mh = .Execute(my_str) '执行匹配
End With
'vba中的正则分组:SubMatches的使用
For i = 0 To mh.Count - 1
'sub_str = sub_str & mh(i).SubMatches(0) & mh(i).SubMatches(1) & " "
Debug.Print mh(i).SubMatches(0) & mh(i).SubMatches(1) & " "
Next
End Sub
---
1、什么是正则表达式
正则表达式是一个天才创建的用于快速检索匹配字符串,通过简单的表达式匹配文本。
————————————————
2、正则表达式的组成
正则表达式也是一个字符串,包括元字符、限定符和正常意义的字符。正则表达式强大的地方就在元字符和限定符。
————————————————
常用元字符
是用于匹配字符串,可以代表一定含义或规律的字符串。主要的元字符如下:
代码说明
.小数点,代表除了换行符以外的任意字符
\转义,若我想匹配一些被正则表达式占用的字符,例如小数点,可以用\.
[abc]匹配中括号内的字符,例如[a-zA-Z],可以匹配到大小写字母
[^abc]不匹配中括号内的字符,例如[^a-z],表示不匹配小写字母
\w可以匹配字母、下划线和数字,相当于[a-zA-Z0-9_]
\W大写的W是小写的w相反情况,也就是不匹配字母、下划线和数字。相当于[^a-zA-Z0-9_]
\s匹配任意空白符,相当于[\f\n\r\t\v]
\S匹配任意非空符,相当于[^\f\n\r\t\v]或[^\s]
\d匹配数字,相当于[0-9]
\D匹配非数字,相当于[^0-9]
\b匹配单词的边界。这个匹配英文单词特别有用。例如\b[\w']+?\b就可以匹配任意单词了
\f匹配换页符
\n匹配换行符
\r匹配回车符
\t匹配tab制表符
\v匹配垂直制表符
^不在中括号内的^,表示从字符串的开头开始匹配
$表示匹配到字符串的结尾.如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或‘\r’。要匹配 $ 字符本身,请使用\$。
x|y匹配x或y
(表达式)元组,用小括号括起来的表达式当作一个元组,可以当作一个整体,也可以被\1\2\3这样类似索引获取。
————————————————
常用限定符
是表示前面字符或元字符出现的次数。主要限定符如下:
代码/语法说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
————————————————
常用反义词
代码/语法说明
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符
————————————————
vba中使用正则表达式
若只是上面这些内容,那么还是纸上谈兵,需要应用到实际中。看看如何在vba中使用正则表达式。
vba使用正则表达式需要用到一个RegExp对象。
该对象可以通过引用Microsoft VBScript Regular Expressions 5.5。再声明定义:
Dim reg As New RegExp
还可以直接用CreateObject方法创建:
Dim reg As Object
set reg = CreateObject("VBScript.Regexp")
创建RegExp对象之后,看看它的相关属性和方法。
属性:
1)Global,是否全局匹配,若为False,匹配到一个结果之后,就不再匹配。默认False,建议设为True;
2)IgnoreCase,是否忽略大小写,默认False,建议设为False,这个会影响到正常表达式匹配;
3)Multiline,是否跨行匹配,默认False,建议设为False,这个会影响到正常表达式匹配;
4)Pattern,获取或设置正则表达式。
方法:
1)Execute,执行匹配
2)Replace,根据正确表达式全部替换
3)Test,测试正则表达式能否匹配到内容
举一些典型的例子:
1)判断是否存在数字
Public Function CheckNumber(str As String) As Boolean
Dim reg As Object
Set reg = CreateObject("VBScript.Regexp")
Dim is_exist As Boolean
With reg
.Global = True
.Pattern = "\d"
is_exist = .Test(str)
End With
CheckNumber = is_exist
End Function
用Test方法,判断能否匹配到数字。
————————————————
获取所有编号
Public Sub GetCode()
Dim reg As Object
Set reg = CreateObject("VBScript.Regexp")
Dim str As String
str = "编号:ABC123155 日期:2016-01-11" & _
"编号:ABD134215 日期:2016-02-21" & _
"编号:CBC134216 日期:2016-01-15"
reg.Global = True reg.Pattern = "[A-Z]{3}\d+" '获取匹配结果'
Dim matches As Object, match As Object
Set matches = reg.Execute(str)
'遍历所有匹配到的结果'
For Each match In matches
'测试输出到立即窗口'
Debug.Print match
Next
End Sub
因为这个编号是3个大写字母和多个数字组成。可以利用代码中的表达式匹配到3个结果:ABC123155、ABD134215和CBC134216。
————————————————
去掉字符串中的数字
Public Function ClearNumber(str As String) As String
Dim reg As Object
Set reg = CreateObject("VBScript.Regexp")
reg.Global = True
reg.Pattern = "\d"
'把所有数字替换成空'
ClearNumber = reg.Replace(str, "")
End Function
执行ClearNumber函数,即可去掉数字。例如ClearNumber("你342好234啊"),可得到"你好啊"。
----------------------------------------
获取子字符串
例如想获取某些字符串中的部分数据,可以匹配完成之后,再用字符串函数处理。但其实不用,用元组可以一次性搞定。
Public Sub GetHref()
Dim reg As Object
Set reg = CreateObject("VBScript.Regexp")
Dim str As String
str = "<a href='xxx1'>xxx1</a><a href='xxx2'>xxx2</a>"
reg.Global = True
'获取a标签中href的属性值'
reg.Pattern = "href='(.+?)'"
'获取匹配结果'
Dim matches As Object, match As Object
Set matches = reg.Execute(str)
'遍历所有匹配到的结果'
For Each match In matches
'测试输出子表达式到立即窗口'
Debug.Print match.SubMatches(0)
Next
End Sub
这里,可以通过match的SubMatches集合获取元组里面的内容。轻松得到xxx1和xxx2。