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

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

'EXCEL VBA 正则表达式从实例开始

所有代码都测试过

'

'

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

'1.正则表达式(Regular Expression)基础

'正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程:

'tutorials/regex/

'''中的正则表达式应用

'在VBA中使用正则表达式,可以通过下列途径实现:

'创建正则表达式对象:

'前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用Microsoft VBScript Regular Expressions 类库,然后直接定义对象:Dim reg As New RegExp。

'后期绑定:使用CreateObject方法定义对象:CreateObject("")。

'前一种方式的优点是可以有编辑器的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 值指示是否找到匹配的模式。属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。

'MatchCollection对象与Match对象

'匹配到的所有对象放在MatchCollection集合中,这个集合对象只有两个只读属性:

'Count: 匹配到的对象的数目

'Item:集合的又一通用方法,需要传入Index值获取指定的元素。

'一般,可以使用For Each语句枚举集合中的对象。集合中对象的类型是Match。

'Match对象有以下几个只读的属性:

'FirstIndex - 匹配字符串在整个字符串中的位置,值从0开始。

'

'Length -匹配字符串的长度

'Value -匹配的字符串

'SubMatches - 集合,匹配字符串中每个分组的值。作为集合类型,有Count和Item两个属性。

'

'常用的正则表达式主要有以下几种:

'匹配中文字符的正则表达式: [\u4e00-\u9fa5]

'评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

'匹配双字节字符(包括汉字在内): [^\x00-\xff]

'评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

'匹配空白行的正则表达式:\n\s*\r

~

'评注: 可以用来删除空白行

'匹配HTML标记的正则表达式:<(\S*)[^>]*>.*|<.* />

'评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

'匹配首尾空白字符的正则表达式:^\s*|\s*$

'评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

'匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

'评注: 表单验证时很实用

'匹配网址URL的正则表达式:[a-zA-z]+:d+\.\d+\.\d+

'评注: 提取ip地址时有用

'匹配特定数字:

(

'^[1-9]\d*$d*|0\.\d*[1-9]\d*$d*|0\.\d*[1-9]\d*)$d*|0\.\d*[1-9]\d*|0\.0+|0)$d*|0\.\ d*[1-9]\d*|0\.0+|0$d*|0\.\d*[1-9]\d*))|0\.0+|0$'\w 匹配字母或数字或下划线或汉字'\s 匹配任意的空白符

'\d 匹配数字

'\b 匹配单词的开始或结束

'^ 匹配字符串的开始

'$ 匹配字符串的结束

'

'表2.常用的限定符

'代码/语法说明

'* 重复零次或更多次

·

' 重复一次或更多次+

'Print 重复零次或一次

'{n} 重复n次

'{n,} 重复n次或更多次

'{n,m} 重复n到m次

'

'表3.常用的反义代码

'代码/语法说明

'\W 匹配任意不是字母,数字,下划线,汉字的字符

'\S 匹配任意不是空白符的字符

'\D 匹配任意非数字的字符

'\B 匹配不是单词开头或结束的位置

'[^x] 匹配除了x以外的任意字符

'[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

'

'表4.常用分组语法

'代码/语法说明分类

'(exp) 匹配exp,并捕获文本到自动命名的组里捕获

'(exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成('name'exp)

'(:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

|

'(=exp) 匹配exp前面的位置零宽断言

'(<=exp) 匹配exp后面的位置

'(!exp) 匹配后面跟的不是exp的位置

'(

'(#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读注释

'

'表5.懒惰限定符

'代码/语法说明

'* 重复任意次,但尽可能少重复

'+ 重复1次或更多次,但尽可能少重复

/

' 重复0次或1次,但尽可能少重复

'{n,m} 重复n到m次,但尽可能少重复

'{n,} 重复n次以上,但尽可能少重复

'

'表6.常用的处理选项

'名称说明

'IgnoreCase(忽略大小写) 匹配时不区分大小写。

'Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)

'Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。

'IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。|

'ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

'

'表7.尚未详细讨论的语法

'代码/语法说明

'\a 报警字符(打印它的效果是电脑嘀一声)

'\b 通常是单词分界位置,但如果在字符类里使用代表退格

'\t 制表符,Tab

'\r 回车

'\v 竖向制表符

'\f 换页符

'\n 换行符

'\e Escape

'\0nn ASCII代码中八进制代码为nn的字符

'\xnn ASCII代码中十六进制代码为nn的字符

'\unnnn Unicode代码中十六进制代码为nnnn的字符

'\cN ASCII控制字符。比如\cC代表Ctrl+C

'\A 字符串开头(类似^,但不受处理多行选项的影响)

'\Z 字符串结尾或行尾(不受处理多行选项的影响)

'\z 字符串结尾(类似$,但不受处理多行选项的影响)

'\G 当前搜索的开头

'\p{name} Unicode中命名为name的字符类,例如\p{IsGreek}

'(>exp) 贪婪子表达式

'(-exp) 平衡组

'(im-nsx:exp) 在子表达式exp中改变处理选项

'(im-nsx) 为表达式后面的部分改变处理选项

'((exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no

'((exp)yes) 同上,只是使用空表达式作为no

'((name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no '((name)yes) 同上,只是使用空表达式作为no

'

'在VBA中使用正则表达式,可以通过下列途径实现:

'创建正则表达式对象:

'前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用Microsoft VBScript Regular Expressions 类库,然后直接定义对象:Dim reg As New RegExp。

'后期绑定:使用CreateObject方法定义对象:CreateObject("")。

'前一种方式的优点是可以有编辑器的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 值指示是否找到匹配的模式。属性对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 = ("123aaaaa987uiiui999")

For Each m In mc

MsgBox

Next

End Sub

Function ExReplace(sStr As String, sReplStr As String, sPatrn As String) As String

'正则表达式替换

'参数说明:sStr原字符串,sReplStr将替换的字符串,sPatrn样式

'返回参数,返回替换后的值

Dim regEX As Object

Set regEX = CreateObject("") 'RegEx为建立正则表达式

= True '设置全局可用

$

= sPatrn '设置样式

ExReplace = (sStr, sReplStr) '执行替换

Set regEX = Nothing

End Function

Function ExExce(sStr As String, sPatrn As String, Optional IC As Boolean = True, Optional G As Boolean = True) As Object

'正则表达式搜索

'参数说明:sStr原字符串,Patrn样式,IC是否区别大小写,G是否全局可用

'返回参数,返回的是一个对象,是搜索的数量

' ExExce(n).FirstIndex搜索的第n个串的位置,n>=0

' ExExce(n).Value搜索的第n个串的值,n>=0

/

Dim regEX As Object

Set regEX = CreateObject("") 'RegEx为建立正则表达式

= True '设置全局可用

= sPatrn '设置样式

= IC '设置是否区分大小写。

Set ExExce = (sStr) '执行搜索

Set regEX = Nothing

End Function

Function ExTest(sStr As String, sPatrn As String, IC As Boolean) As Boolean

'正则表达式匹配

~

'VBA代码

'参数说明:sStr原字符串,Patrn样式,IC是否区别大小写

'返回参数,返回一个逻辑值,True为匹配,False为不匹配

Dim regEX As Object

Set regEX = CreateObject("") 'RegEx为建立正则表达式

= True '设置全局可用

= sPatrn '设置样式

= IC '设置是否区分大小写。

ExTest = (sStr) '执行搜索测试

Set regEX = Nothing

End Function

Public Sub 去重复()

Dim ss, re, rv

ss = "Is is the cost of of gasoline going up up." & vbNewLine

Set re = New RegExp

= "\b([a-z]+) \1\b"

= True

= True

= True

rv = (ss, "$1")

&

MsgBox rv

End Sub

Function RegExpTest(patrn, strng)

'正则表达式(RegExp)对象

'提供简单的正则表达式支持功能

'下面的代码说明了RegExp对象的用法:

Dim regEX, match, matches ' 建立变量。

Set regEX = New RegExp ' 建立正则表达式。

= patrn ' 设置模式。

= True ' 设置是否区分字符大小写。

= True ' 设置全局可用性。

Set matches = (strng) ' 执行搜索。

For Each match In matches ' 遍历匹配集合。

retStr = retStr & "Match found at position "

retStr = retStr & & ". Match Value is '"

retStr = retStr & & "'." & vbCrLf

Next

RegExpTest = retStr

End Function

'Global 属性

'设置或返回一个Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。

' [= True | False ]

'对象参数总是RegExp 对象。如果搜索应用于整个字符串,Global 属性的值为True,否则其值为False。默认的设置为False。

'下面的代码说明了Global 属性的用法(改变赋予Global 属性的值并观察其效果):Function RegExpTest1(patrn, strng)

Dim regEX, match, matches ' 建立变量。

Set regEX = New RegExp ' 建立规范表达式。

= patrn ' 设置模式。

= True ' 设置是否区分字母的大小写。

= True ' 设置全程性质。

;

Set matches = (strng) ' 执行搜索。

For Each match In matches ' 重复匹配集合

retStr = retStr & "Match found at position "

RetStr=RetStr&&".Match Value is '"

RetStr=RetStr&&"'."&vbCRLF Next

RegExpTest = retStr

End Function

'IgnoreCase 属性

'设置或返回一个Boolean值,指明模式搜索是否区分大小写。

' [= True | False ]

&

'Object 参数总是一个RegExp 对象。如果搜索是区分大小写的,则IgnoreCase 属性为False;否则为True。缺省值为False。

'说明

'下面的代码说明了IgnoreCase 属性的用法(改变赋予IgnoreCase 属性的值以观察其效果):

Function RegExpTest2(patrn, strng)

Dim regEX, match, matches ' 建立变量。

Set regEX = New RegExp ' 建立正则表达式。

= patrn ' 设置模式。

= True ' 设置不区分大小写。

= True ' 设置全局可用性

Set matches = (strng) ' 执行搜索。

|

For Each match In matches ' 重复匹配集合

retStr = retStr & "Match found at position "

RetStr=RetStr&&".Match Value is '"

RetStr=RetStr&&"'."&vbCRLF

Next

RegExpTest = retStr

End Function

'Execute 方法

'对指定的字符串执行正则表达式搜索

'(string)

*

'参数

'Object

'必选项。总是一个RegExp 对象的名称。

'string

'必选项要在其上执行正则表达式的文本字符串

'说明

'正则表达式搜索的设计模式是通过RegExp 对象的Pattern 来设置的。

'Execute 方法返回一个Matches 集合,其中包含了在string 中找到的每一个匹配的Match 对象。如果未找到匹配,Execute 将返回空的Matches 集合。

'下面的代码说明了Execute 方法的用法。

Function RegExpTest3(patrn, strng)

Dim regEX, match, matches ' Create variable.

Set regEX = New RegExp ' Create a regular expression.

= patrn ' Set pattern.

= True ' Set case insensitivity.

= True ' Set global applicability.

Set matches = (strng) ' Execute search.

For Each match In matches ' Iterate Matches collection.

retStr = retStr & "Match found at position "

retStr = retStr & & ". Match Value is '"

retStr = retStr & & "'." & vbCrLf

#

Next

RegExpTest = retStr

End Function

'Replace 方法

'替换在正则表达式查找中找到的文本

'(string1, string2)

'参数

'Object

'必选项。总是一个RegExp 对象的名称。

'string1

^

'必选项string1 是将要进行文本替换的字符串

'string2

'必选项。string2 是替换文本字符串。

'说明

'被替换的文本的实际模式是通过RegExp 对象的Pattern 属性设置的。

'Replace 方法返回string1 的副本,其中的文本已经被替换为string2。如果没有找到匹配的文本,将返回原来的string1 的副本。

'下面的例子说明了Replace 方法的用法。

Function ReplaceTest4(patrn, replStr)

Dim regEX, str1 ' 建立变量。

str1 = "The quick brown fox jumped over the lazy dog."

*

Set regEX = New RegExp ' 建立正则表达式。

= patrn ' 设置模式。

= True ' 设置是否区分大小写。

ReplaceTest = (str1, replStr) ' 作替换。

End Function

'MsgBox(ReplaceTest("fox", "cat")) ' 将'fox' 替换为'cat'。

';另外,Replace 方法在模式中替换subexpressions 。下面对以前示例中函数的调用,替换了原字符串中的所有字对:

'MsgBox (ReplaceText("(\S+)(\s+)(\S+)", "$3$2$1")) ' 交换词对.

'test 方法

^

'对指定的字符串执行一个正则表达式搜索,并返回一个Boolean 值指示是否找到匹配的模式。

'(string)

'参数

'Object

'必选项。总是一个RegExp 对象的名称。

'string

'必选项要执行正则表达式搜索的文本字符串

'说明

'正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的属性对Test方法没有影响

'如果找到了匹配的模式,Test方法返回True;否则返回False。

'下面的代码说明了Test 方法的用法

Function RegExpTest5(patrn, strng)

Dim regEX, retVal ' 建立变量。

Set regEX = New RegExp ' 建立正则表达式。

= patrn ' 设置模式。

= False ' 设置是否区分大小写。

retVal = (strng) ' 执行搜索测试。

If retVal Then

RegExpTest = "找到一个或多个匹配。"

Else

-

RegExpTest = "未找到匹配。"

End If

End Function

'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4"))

'Match 对象

'提供了对正则表达式匹配的只读属性的访问

'说明

'Match 对象只能通过RegExp 对象的Execute 方法来创建,该方法实际上返回了Match

对象的集合。所有的Match 对象属性都是只读的。

>

'在执行正则表达式时,可能产生零个或多个Match 对象。每个Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。

'下面的代码说明了Match 对象的用法:

Function RegExpTest6(patrn, strng)

Dim regEX, match, matches ' 建立变量。

Set regEX = New RegExp ' 建立正则表达式。

= patrn ' 设置模式。

= True ' 设置是否区分大小写。

= True ' 设置全局替换。

Set matches = (strng) ' 执行搜索。

~

For Each match In matches ' 遍历Matches 集合。

retStr = retStr & "Match " & i & " found at position "

retStr = retStr & & ". Match Value is " '

retStr = retStr & & "'." & vbCrLf

Next

RegExpTest = retStr

End Function

'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4"))

'Matches 集合

@

'正则表达式Match 对象的集合。

'

'说明

'Matches 集合中包含若干独立的Match 对象,只能使用RegExp 对象的Execute 方法来创建之。与独立的Match 对象属性相同,Matches `集合的一个属性是只读的。

'

'在执行正则表达式时,可能产生零个或多个Match 对象。每个Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索引。

'

'下面的代码将说明如何使用正则表达式查找获得Matches 集合,以及如何循环遍历集合:

Function RegExpTest7(patrn, strng)

"

Dim regEX, match, matches ' 创建变量。

Set regEX = New RegExp ' 创建正则表达式。

= patrn ' 设置模式。

= True ' 设置是否区分大小写。

= True ' 设置全程匹配。

Set matches = (strng) ' 执行搜索。

For Each match In matches ' 循环遍历Matches 集合。

retStr = retStr & "Match found at position "

retStr = retStr & & ". Match Value is '"

retStr = retStr & & "'." & vbCrLf

&

Next

RegExpTest = retStr

End Function

'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4"))

'SubMatches8 集合

'正则表达式子匹配字符串的集合

'说明

'SubMatches 集合包含了单个的子匹配字符串,只能用RegExp 对象的Execute 方法创建。SubMatches 集合的属性是只读的。

'运行一个正则表达式时,当圆括号中捕捉到子表达式时可以有零个或多个子匹配。

|

'SubMatches 集合中的每一项是由正则表达式找到并捕获的的字符串。

'下面的代码演示了如何从一个正则表达式获得一个SubMatches 集合以及如何操作它的专有成员:

Sub MatchTest8()

inpStr = ""

Dim oRe, oMatch, oMatches

Set oRe = New RegExp

' 查找一个电子邮件地址(不是一个理想的RegExp)

= "(\w+)@(\w+)\.(\w+)"

' 得到Matches 集合

Set oMatches = (inpStr) '因为只有一个地址,所以,集合只有一项,就是索引=0的那个

' 得到Matches 集合中的第一项

Set oMatch = oMatches(0)

' 创建结果字符串。

' Match 对象是完整匹配—

retStr = "电子邮件地址是:" & oMatch & vbNewLine

' 得到地址的子匹配部分。

retStr = retStr & "电子邮件别名是:" & (0) ' dragon

retStr = retStr & vbNewLine

retStr = retStr & "组织是:" & (1) ' xyzzy

$

SubMatchTest = retStr

MsgBox retStr

End Sub

'MsgBox(SubMatchTest("请写信到。谢谢!")) Sub jj1()

'把数字筛选出来不包含括号的数字

Dim kk()

Set x = CreateObject("")

= 1

= "^(.*)\(.*"

j = 1

For Each y In [a2:h2]

ReDim Preserve kk(1 To j)

If (y) Then

Set mchs = (y)

Set mc = mchs(0)

retStr = (0)

kk(j) = Val(retStr)

j = j + 1

End If

Next

MsgBox (kk)

End Sub

Sub jj()

'把数字筛选出来不包含括号的数字

Dim kk()

Set x = CreateObject("")

= 1

= "^(.*)\(.*"

j = 1

For Each y In [a2:h2]

ReDim Preserve kk(1 To j)

If (y) Then

kk(j) = Val(y)(0).SubMatches(0))

j = j + 1

End If

Next

MsgBox (kk)

End Sub

Sub 删除空格()

Dim reg As Object

Dim arr

Dim i As Integer

rw = Range("A65536″).End(xlUp).Row

Columns("B").ClearContents

arr = Range("A1:A" & rw)

Set reg = CreateObject("")

With reg

.Global = True

.IgnoreCase = True

.Pattern = "^ " '符合样式就用""替换

End With

For i = 1 To UBound(arr)

Range("B" & i) = (arr(i, 1), "")

Next

End Sub

' 过程删除空格()

' 定义变量reg 为对象

' 定义变量arr

' 定义变量i 为长整型值,j 为长整型值

' i = 单元格区域(“a65536″) . 结束(方向向上) . 行标

' 列坐标(“b”) . 清除内容

' arr = 单元格区域(“a1:a”& i)

' 设置reg = 创建对象(“vbscript . regexp”)

' 工作于reg

' .全局= True

' .忽略大小写= True

}

' . 样式= “^ ”

' 结束工作于

' 循环范围j = 1 到i

' 单元格区域(“b”& j) = reg . 替换字符串(arr(j ,1) ,"")

' 下一句

' 结束过程_________________________________________________________ ' 正则表达式示例1 提取字符串中的数字

Sub getNum1()

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

' 引用Microsoft VBScript Regular Expressions 类库

*

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 = ("123aaaaa987uiiui999")

For Each m In mc

MsgBox + 1

Next

End Sub

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

Sub getNum2()

Dim arr

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

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

/

For i = 0 To UBound(arr)

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

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

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

c = c & sr & " "

Next

End With

MsgBox c

End Sub

`

Function zldccmx(rng As Range, Ms As Integer)

Dim ys(1 To 12): Dim regEX

ys(1) = "[^A-Za-z0-9]" '只保留字母和数字

ys(2) = "[^!-~]" '去除中文

ys(3) = "[!-~]" '"\w" '留中文

ys(4) = "\d" ' 去掉数字

ys(5) = "[^\d]" ' 留数字

ys(6) = "\D" '去除非数字(留数字)

ys(7) = "[a-zA_Z]" '去除英文大小写字符

ys(8) = "3*a*" '去除所有指定字符,这里指去除3和a

ys(9) = "36*" '去除所有指定字符,这里指去除"36"

ys(10) = "[^3]" '去除所有非特定字符,这里指去除不是3的字符

ys(11) = "[^0-9.]" '只保留数字和小数点

ys(12) = "[^0-9/.+-^\*^]" '保留数字和运算符号+-*/^

Set regEX = CreateObject("") 'RegEx为建立正则表达式

= True '设置全局可用

= ys(Ms) '样式

zldccmx = (rng, "")

Set regEX = Nothing

End Function

'问题: 字符串中1个或者连续多个空格替换成一个Tab键

'分析:由于字符串中连续的空格的个数不太确定,如果我们逐个字符去分析的话,

'也是比较麻烦的,但如果用正则去实现,则简单的多。这也是一个典型的适合用正则解决的问题。

'解决方式如下:

Sub Test7()

Dim regEX As Object, str

str = "abc de fg"

Set regEX = CreateObject("")

With regEX

.Global = True

.Pattern = "\s+"

End With

st = (str, " ")

MsgBox st

Set regEX = Nothing

End Sub

Sub test1()

Dim str

Set reg = CreateObject("")

= True

%

= "\d{9}"

str = "aaaaaaa9qqqqqqqqqqqq1aaaa"

Set col = (str)

If > 0 Then

For Each mch In col

sm = sm & & " "

Next

End If

MsgBox sm

End Sub

Sub r_1()

' 1) Global 属性

' False,如果找到匹配的字符,就停止搜索(默认值)

' True ,搜索字符串中全部字符

Dim regEX As Object

Dim x As String

x = "a1b2c3"

Set regEX = CreateObject("")

With regEX

.Global = True '返回"a#b#c#" !

' .Global = False '返回"a#b2c3"

.Pattern = "\d" '数字字符匹配

MsgBox .Replace(x, "#")

End With

End Sub

'2) IgnoreCase 属性

'如果搜索是区分大小写的,为False(缺省值)

'True不分

Sub r_2()

Dim regEX As Object

Dim x As String

x = "a1A2"

Set regEX = CreateObject("")

With regEX

.Global = True

.IgnoreCase = True '返回"#1#2"

'.IgnoreCase = False '返回"ab#2"

.Pattern = "A" '数字字符匹配

MsgBox .Replace(x, "#")

End With

?

End Sub

'3) Multiline 属性

' 返回正则表达式是否具有标志m , 缺省值为False

Sub r_3()

Dim regEX As Object

Dim x As String

x = "a1b2" & Chr(13) & "c3d4"

Set regEX = CreateObject("")

With regEX

.Global = True '

?

.MultiLine = True

.Pattern = "\d+$"

MsgBox .Replace(x, "#")

End With

End Sub

'4) Pattern 属性

' 一个字符串,用来定义正则表达式。缺省值为空文本。

'5) Execute 方法

' 返回一个MatchCollection 对象,该对象包含每个成功匹配的Match 对象。Sub r_5()

(

Dim regEX As Object

Dim matchs As Object, match As Object

Dim x As String, y As String

x = "a1b2c3"

Set regEX = CreateObject("")

With regEX

.Global = True

.Pattern = "\d" '匹配数字

Set matchs = .Execute(x)

For Each match In matchs

y = y & match

Next

End With

MsgBox y 'y返回123

End Sub

'6) Test 方法

' 返回一个布尔值,该值指示正则表达式是否与字符串成功匹配。

Sub r_6()

Dim regEX As Object

Dim x As String, y As String

}

Dim i As Integer

x = "a1b2c3"

Set regEX = CreateObject("")

With regEX

.Global = True

.Pattern = "\d"

For i = 1 To Len(x)

If .Test(Mid(x, i, 1)) Then y = y & Mid(x, i, 1)

Next i

End With

>

MsgBox y 'y返回123 End Sub

Public Sub ty2() '提取英文字母并去重复

Dim arr, i&, y, str$

str = "$A$8,$D$11,$D$5,,$D$10,$G$12"

With CreateObject("")

.Global = True

.Pattern = "[$,0-9]"

str = .Replace(str, "")

.Pattern = "(.)\1{1,}"

|

str = .Replace(str, "$1")

End With

str

End Sub

'把文件中的空白行去掉:假设d盘有一个文本,内容如下

'

'8 5 4 1 6 3 2 7 9

'

'7 6 2 9 5 8 3 4 1

'

/

'9 3 1 4 2 7 8 5 6

'

'

'

'6 9 3 8 7 5 1 2 4

'

'5 1 8 3 4 2 6 9 7

'

'2 4 7 6 1 9 5 3 8

'

`

'

'

'3 26 7 8 4 9 1 5

'

'4 8 9 5 3 1 7 6 2

'

'1 7 5 2 9 6 4 8 3

'

'正则表达式:\r\n\r\n

'

~

'分析:\r\n匹配一个回车+换行组合,windows操作系统中把它作为文本行的结束标签。'使用正则表达式\r\n\r\n进行的搜索将匹配两个连续的行尾标签,而这正好是空白行。

'注意:Unix和Linux操作系统中只使用一个换行符来结束一个文本行,换句话说,

'在Unix或Linux系统中匹配空白行只使用\n\n即可,不需要加上\r

Sub test8()

f = "d:\"

s = CreateObject("").OpenTextFile(f, 1, 1, -2).ReadAll

With CreateObject("")

.Global = True

.Pattern = "(\r\n){2}"

#

CreateObject("").OpenTextFile(f, 2, 1).Write .Replace(s, "")

End With

End Sub

'例1、有如下一组电话号码,如何改变成右侧的样式。

':假设d盘有一个文本,内容如下

'(020)

'(021)

'(0371) 9

'(0392)1234567

'(010) 0

,

'(0393) 6

'(0372) 1

Sub ff()

f = "d:\"

s = CreateObject("").OpenTextFile(f, 1, 1, -2).ReadAll

With CreateObject("")

.Global = True

.Pattern = "\((\d{3,4})\)(\d+)" '设置正则表达式

CreateObject("").OpenTextFile(f, 2, 1).Write .Replace(s, "$1-$2")

End With

/

End Sub

'正则表达式的三步曲应该是:1、查找;2、引用匹配了的文本(后向引用);3、有选择地替换文本。

'案例:

'我们的电话格式通常都是:(区号)电话,比如说:(029)8401132;现在假设我们要求把文本中所有的电话格式都改为:029-*******,我们可以这样做:

'Text

'(020)

'(021)

'(029)

'regEX

相关主题
相关文档
最新文档