vba中的正则分组:SubMatches的使用

"(人民币大写:)(\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。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的两个VBA代码,可以看出这两个代码都是使用则表达式来处理Excel的数据。第一个代码是用来提取数字运算符的,第二个代码是用来提取品名和型号的。如果你想要使用则表达式来分列,可以参考以下步骤: 1.首先,你需要打开Excel文件并按下Alt+F11打开VBA编辑器。 2.在VBA编辑器,你需要插入一个新的模块。可以通过点击“插入”菜单,然后选择“模块”来完成这个操作。 3.在新的模块,你需要编写一个新的VBA代码。这个代码需要使用则表达式来分列。以下是一个简单的例子: ```VBA Sub SplitColumns() Dim regex As Object Set regex = CreateObject("VBScript.RegExp") regex.Pattern = "(\d+)\s+(\w+)" Dim cell As Range For Each cell In Selection If regex.Test(cell.Value) Then Dim matches As Object Set matches = regex.Execute(cell.Value) cell.Offset(0, 1).Value = matches(0).SubMatches(0) cell.Offset(0, 2).Value = matches(0).SubMatches(1) End If Next End Sub ``` 4.在这个代码,我们使用了VBScript.RegExp对象来创建一个则表达式对象。然后,我们设置了则表达式的模式,这个模式可以匹配一个数字和一个单词。接下来,我们遍历了选定的单元格,并对每个单元格进行了测试。如果单元格的值与则表达式匹配,我们就使用Execute方法来获取匹配项。最后,我们将匹配项的子匹配项分别放入单元格的相邻列。 5.最后,你只需要在Excel选择你想要分列的单元格,然后运行这个VBA代码即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值