`
tangleilei
  • 浏览: 14000 次
  • 来自: 上海
社区版块
存档分类
最新评论

vba regexp

阅读更多
[2011-09-09:http://www.cnblogs.com/dxy1982/archive/2011/09/09/2159246.html]

[2010-08-08:http://www.excelpx.com/thread-137472-1-1.html] 


数据验证经常出现的情况是,需要验证和处理大量的文本内容,有时候需要查找字符串,有时候要按条件替换,并且这些待处理的问题还是有一定的规律可循的,但是无法通过枚举的方式挨个验证,这个时候就需要正则表达式来帮忙。


1.正则表达式(Regular Expression)基础
  正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程:
http://deerchao.net/tutorials/regex/regex.htm
http://www.regexlab.com/zh/regref.htm
http://www.williamlong.info/archives/433.html

2.VBA中的正则表达式应用
  在VBA中使用正则表达式,可以通过下列途径实现:
创建正则表达式对象:
前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用Microsoft VBScript Regular Expressions 5.5类库,然后直接定义对象:Dim reg As New RegExp。
后期绑定:使用CreateObject方法定义对象:CreateObject("VBSCRIPT.REGEXP")。
前一种方式的优点是可以有编辑器的Intellisense支持。

RegExp对象的属性:
Global - 设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值应该为 True,否则其值为 False。默认的设置为True。
Multiline - 返回正则表达式是否具有标志m, 缺省值为False。如果指定的搜索字符串分布在多行,这个属性是要设置为True的。
IgnoreCase - 设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 IgnoreCase 属性应该为False;否则应该设为True。缺省值为True。
Pattern - 设置或返回被搜索的正则表达式模式。 被搜索的正则字符串表达式。它包含各种正则表达式字符。

RegExp对象的方法:
Execute - 对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过 RegExp对象的Pattern来设置的。Execute方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对 象。如果未找到匹配,Execute将返回空的Matches集合。
Replace - 替换在正则表达式查找中找到的文本。
Test - 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。

MatchCollection对象与Match对象
匹配到的所有对象放在MatchCollection集合中,这个集合对象只有两个只读属性:
Count:匹配到的对象的数目
Item:集合的又一通用方法,需要传入Index值获取指定的元素。

一般,可以使用For Each语句枚举集合中的对象。集合中对象的类型是Match。
Match对象有以下几个只读的属性:
FirstIndex - 匹配字符串在整个字符串中的位置,值从0开始。
Length - 匹配字符串的长度。
Value - 匹配的字符串。
SubMatches - 集合,匹配字符串中每个分组的值。作为集合类型,有Count和Item两个属性。

结尾两个示例:

' 正则表达式示例1 提取字符串中的数字

Sub getNum1()

    ' 这种使用方式需要"工具""引用"

    ' 引用Microsoft VBScript Regular Expressions 5.5类库

    Dim reg As New RegExp

    With reg

        .Global = True

        .IgnoreCase = True

        .Pattern = "\d+"

    End With

   

   Dim mc As MatchCollection

   Dim m As Match

   Set mc = reg.Execute("123aaaaa987uiiui999")

   For Each m In mc

    MsgBox m.Value + 1

   Next

End Sub

' 正则表达式示例2 用"字符串"替换原字符串中符合匹配模式的部分

Sub getNum2()

    Dim arr

    arr = Split("A12B-R1E2W-E1T-R2T-Q1B2Y3U4D", "-") ' split(字符串,"分隔符")拆分字符串

    MsgBox "arr(0)=" & arr(0) & ";arr(1)=" & arr(1)

    MsgBox Join(arr, ",") ' join(数组,"分隔符")用分隔连接数组的每个元成一个字符串

   

    Dim arrStr() As String

    ReDim arrStr(LBound(arr) To UBound(arr)) ' 为动态数组分配存储空间

    With CreateObject("VBSCRIPT.REGEXP") ' 生成一个正则表达式对象实例

        For i = LBound(arr) To UBound(arr)

            .Global = True ' 设置全局可用,即替换所有符合匹配模式的字符串

            .Pattern = "[^A-Z]" ' 匹配模式为非大写字母

            arrStr(i) = .Replace(arr(i), "") ' 将arr(i)字符串中符合匹配模式的部分替换为空字符

        Next

    End With

    Cells.ClearContents

    Cells(1, 1).Resize(UBound(arr) + 1, 1) = Application.WorksheetFunction.Transpose(arrStr())

End Sub



他那代码没看,自己用到写了下

Java代码  收藏代码
1.'<body>タグに onLoad="commonOnload()"があるか。 
2.Private Function SubCheckBodyCommonOnload(pageStr) 
3.         Dim reg As Object 
4.         Set reg = CreateObject("VBscript.RegExp") 
5.            With reg 
6.                .Global = True 
7.                .IgnoreCase = True 
8.                .Pattern = "(<)([\s]*)(body)([\w\W]*)(onLoad)([\s]*)=([\s]*)(\W)([\s]*)(commonOnload\()([\s]*)(\))" 
9.            End With 
10.             
11.        SubCheckBodyCommonOnload = reg.test(pageStr) 
12.End Function 
数据结构有云:程序=数据+操作。从中可以看出,数据才是程序的核心对象,每个程序所有的操作和意图都是围绕数据展开的。每个程序的结构基本都分为三个部分:输入,处理,输出。输入是接收用户的数据,处理过程是通过不同的算法处理接收的数据,输出是将处理的结果返回给用户。
一、输入与输出
大家还记得在VBA我们一般通过什么方式接受用户的简单输入呢?没错,最简单的方式就是Msgbox与InputBox。
Msgbox:最简单的用户输入框
Msgbox太简单了,以至于大家用的最多的就是其显示信息的功能,其实它是有返回值的。它的语法如下所示:


MsgBox(Prompt[,Buttons][,Title][,Helpfile,Context]) As Integer

这里用户的输入就是他选择的按钮,也就是Integer值所代表的选项。这里用户的选择比较简单,所以不用验证。



InputBox:最简单的全能型用户输入框
VBA内置的InputBox方法
这个函数返回一个字符串,选择取消后返回空串(零个字节的字符串)。它不含有容错处理。例如你想要用户输入整数,结果用户输入了字符,这个时候InputBox并不会替你告诉用户错误的原因。

Application的InputBox函数
这个函数更强大,内置容错处理,选择取消后返回false。这个函数可以指定输入的类型,当用户输入的数据类型与参数中指定的类型不兼容的时候,这个函数会给出温馨的提示,告诉你输入的数据类型不对。



除了这两种最简单的输入方式外,还有其它一些重要的输入方式:
单元格输入:这种方式是最常见的,用户在单元格中输入数据,然后程序获取单元格中数据并处理。
用户窗口输入:这种方式最直观,比较适合处理结构化数据;利用窗口,我们可以提供专业的用户视觉体验和便利的用户输入体验。
文件输入:这种方式适合导入大量的数据或其它来源的数据。



说完了输入,再说说输出。VBA中输出也有相对应的几种方式:
Msgbox:最简单的输出信息方式。
单元格输出:可以显示大量的处理结果。
用户窗口输出:显示一些自定义的信息和格式,用户体验较佳。
文件输出:输出大量的信息和结果。
立即窗口输出:一般用于调试的时候显示信息(Debug.Print)。

上面我们简单总结了常见的输入与输出方式。用户输入的数据是我们工作的前提,那么这些数据是否符合我们的需求,我们就需要去验证。


二、简单数据验证
1.简单数据输入与类型验证

这个很好办,直接使用Application中的InputBox函数就可以达到这个目的。

2.内置函数验证
如果只是简单验证数据的类型,或者某些简单的判断也可以靠VBA中内置的一些函数来验证。我在前面的内置函数中已经总结了,主要有两类的内置函数:
VBA内置的验证函数有:
IsNumeric(x) - 是否为数字, 返回Boolean结果。
IsDate(x)  - 是否是日期, 返回Boolean结果。
IsEmpty(x) - 是否为Empty, 返回Boolean结果。
IsArray(x) - 指出变量是否为一个数组。
IsError(expression) - 指出表达式是否为一个错误值。
IsNull(expression) - 指出表达式是否不包含任何有效数据 (Null)。
IsObject(identifier) - 指出标识符是否表示对象变量。


WorksheetFunction内置的验证函数有:
IsErr - 检查是不是除了#N/A外的错误值.
IsError - 检查是不是错误值(#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?,或者 #NULL!).
IsEven - 检查是否是偶数.
IsOdd - 检查是否是奇数.
IsLogical - 检查是不是布尔值.
IsNA - 检查值是否是错误值#N/A(值不可用)。
IsNonText - 检查是否是非文本(空的单元格返回true)。
IsNumber - 检查是不是数字。
IsText - 一般用于判断单元格中内容是否是文本。


三、复杂数据验证
  在前面的例子中,验证的内容都还是比较简单;实际的工作中,很多时候,我们可以通过大量的IF语句来达到验证数据内容的目的。除了这一类可进行枚举验证的情况,还有一类经常出现的情况是,需要验证和处理大量的文本内容,有时候需要查找字符串,有时候要按条件替换,并且这些待处理的问题还是有一定的规律可循的,但是无法通过枚举的方式挨个验证,这个时候就需要正则表达式来帮忙。
1.正则表达式(Regular Expression)基础
  正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程:
http://deerchao.net/tutorials/regex/regex.htm
http://www.regexlab.com/zh/regref.htm
http://www.williamlong.info/archives/433.html



2.VBA中的正则表达式应用
  在VBA中使用正则表达式,可以通过下列途径实现:
创建正则表达式对象:
前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用Microsoft VBScript Regular Expressions 5.5类库,然后直接定义对象:Dim reg As New RegExp。
后期绑定:使用CreateObject方法定义对象:CreateObject("VBSCRIPT.REGEXP")。
前一种方式的优点是可以有编辑器的Intellisense支持。

RegExp对象的属性:
Global - 设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值应该为 True,否则其值为 False。默认的设置为True。
Multiline - 返回正则表达式是否具有标志m, 缺省值为False。如果指定的搜索字符串分布在多行,这个属性是要设置为True的。
IgnoreCase - 设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 IgnoreCase 属性应该为False;否则应该设为True。缺省值为True。
Pattern - 设置或返回被搜索的正则表达式模式。 被搜索的正则字符串表达式。它包含各种正则表达式字符。

RegExp对象的方法:
Execute - 对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过 RegExp对象的Pattern来设置的。Execute方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。如果未找到匹配,Execute将返回空的Matches集合。
Replace - 替换在正则表达式查找中找到的文本。
Test - 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。

MatchCollection对象与Match对象
匹配到的所有对象放在MatchCollection集合中,这个集合对象只有两个只读属性:
Count:匹配到的对象的数目
Item:集合的又一通用方法,需要传入Index值获取指定的元素。

一般,可以使用For Each语句枚举集合中的对象。集合中对象的类型是Match。
Match对象有以下几个只读的属性:
FirstIndex - 匹配字符串在整个字符串中的位置,值从0开始。
Length - 匹配字符串的长度。
Value - 匹配的字符串。
SubMatches - 集合,匹配字符串中每个分组的值。作为集合类型,有Count和Item两个属性。



正则表达式很强大,是处理文本的首选,不管你信不信,反正我是信了。说了很多,最后以一个小例子结尾吧:


复制代码

Sub Test()
    Dim reg As New RegExp
    With reg
        .Global = True
        .IgnoreCase = True
        .Pattern = "\d+"
    End With
   
   Dim mc As MatchCollection
   Dim m As Match
   Set mc = reg.Execute("123aaaaa987uiiui999")
   For Each m In mc
    MsgBox m.Value
   Next
End Sub
非原创
分享到:
评论

相关推荐

    EXCEL VBA PDF 文件

    Set RegEx = CreateObject("vbscript.regexp") With RegEx .Global = True .MultiLine = True .IgnoreCase = True .Pattern = "%OBJECT_ID\=\((\d+)" End With [a1:c1] = Split("账单编号,公司名称,文件名...

    正则表达式入门与提高---整理版_VBa_正则式_

    在VBA中,我们通常使用`RegExp`对象来操作正则表达式。首先,创建一个`RegExp`对象,然后设置其`Pattern`属性为我们要匹配的正则表达式模式。例如: ```vba Dim regEx As Object Set regEx = CreateObject(...

    VBA抓取页面数据

    matches = sc.ExecuteStatement("var re = new RegExp(""" & regEx & """" & _ ", 'g'); re.exec(""" & elem.innerText & """)") If Not IsNull(matches) Then Debug.Print matches(0) ' 打印第一个匹配项 End If ...

    vba比较两个配置文件

    Set regEx = CreateObject("VBScript.RegExp") regEx.Pattern = "^\s*(\w+)\s*=\s*(\w+)" '匹配形如 "key=value" 的行 ``` 3. **文件内容比较**:遍历两个文件,逐行进行正则匹配,对比每个配置项。如果找到不匹配的...

    VBA中采用正则表达式的四则运算

    采用正则表达式的四则运算:在VBA环境中,如何使用正则表达式,将正则表达式应用到四则运算中的算是分解中。 Dim r1 As RegExp Dim m1 As Match Dim mc1 As MatchCollection Dim str As String Dim sstr As String ...

    vba 正规表达式应用

    2. **创建实例**:创建`RegExp`对象,如`Dim regEx As New RegExp`。 3. **设置模式**:使用`Pattern`属性设置正则表达式,如`regEx.Pattern = "\d+"`。 4. **启用全局匹配**:如果需要匹配所有出现的模式,设置`...

    vba 正则表达式

    在VBA中,可以通过`New RegExp`或`CreateObject("VBScript.RegExp")`的方式来创建正则表达式对象。这两种方法可以达到相同的效果,但在不同的上下文中可能会有不同的选择。 **示例代码**: ```vba Sub CreateRegExp...

    提取数字、中英文VBA编程

    - **正则表达式**:VBA支持正则表达式库,通过` RegExp对象 `可以匹配、查找和替换数字。例如,可以使用`\d+`来匹配一个或多个连续的数字。 - **InStr 和 Mid 函数**:`InStr`用于找到字符串中特定字符或字符串的...

    EXCEL-VBA-正则表达式-从实例开始.docx

    - **前期绑定**:在VBA编辑器中通过“Tools”菜单下的“References”选项引用Microsoft VBScript Regular Expressions 5.5 类库,之后可以直接定义`RegExp`对象,如:`Dim reg As New RegExp`。这种方式的优点是提供...

    vba-字典用法

    字典对象是Microsoft Windows脚本语言中的一部分,与正则表达式(RegExp)对象和文件系统对象(FileSystemObject)等一样,都是脚本语言的强大工具。字典对象的特点在于它是由一组唯一的键(Key)及其关联的数据项(Item)...

    VBA 学习笔记

    在第四十一集中提到的例子中,`RegExp`对象被用来创建一个正则表达式实例,`Global`属性设置为`True`,意味着在整个字符串中查找所有匹配项,而`Pattern`属性则设置为要匹配的模式。在循环中,VBA遍历工作表的每一行...

    Excel VBA数据验证与正则表达式汇总整理-VBA源码.rar

    在VBA中,可以使用`VBScript_RegExp_55`对象来执行正则表达式的操作。例如,如果我们想要检查一个字符串是否符合电子邮件地址的格式,可以编写如下VBA代码: ```vba Function IsEmailValid(email As String) As ...

    VBA中的IE对象操作.txt )

    Set myReg = CreateObject("Vbscript.RegExp") myReg.Global = True myReg.Pattern = "[\u4e00-\u9fa5]+" For Each tempRng In rng Set myMatchs = myReg.Execute(tempRng.Text) For Each tempM In myMatchs...

    汉字字母数字_ExcelVBA_源码

    Set regEx = CreateObject("VBScript.RegExp") With regEx .Global = True .Pattern = "[\u4e00-\u9fa5]" ' 匹配汉字的Unicode范围 End With Dim rng As Range For Each rng In Selection If regEx.Test...

    Excel-VBA宏编程实例源代码-以正规方式确定任意字符串存在.zip

    在VBA中,我们可以通过使用`Scripting.RegExp`对象来处理正则表达式。下面将详细解释这个实例的可能实现和涉及的知识点: 1. **创建正则表达式对象**: 首先,我们需要创建一个`RegExp`对象,这是VBA中处理正则...

    Excel-VBA宏编程实例源代码-文本与图形的操作-员工信息.zip

    在VBA编辑器中,你可以看到如何使用Range对象来访问单元格,使用ChartObjects和Charts对象来操作图表,以及使用String和RegExp对象进行文本处理。 例如,一个简单的宏可能如下所示: ```vba Sub 处理员工信息() ...

    VBA正则表达式入门与提高.pdf

    ### VBA正则表达式入门与提高 #### 内容提要 本书旨在为读者提供一个全面学习VBA中正则表达式应用的平台。通过详细的理论介绍与实践案例分析,帮助初学者快速掌握正则表达式的使用方法,并进一步提升至高级应用...

Global site tag (gtag.js) - Google Analytics