簡(jiǎn)明Excel VBA
本文集同步于GitHub倉(cāng)庫(kù):# bluetata/concise-excel-vba
1.7 正則表達(dá)式(Regular Expression)
在VBA中使用正則表達(dá)式遭居,因?yàn)檎齽t表達(dá)式不是vba自有的對(duì)象躏敢,
故此要用它就必須采用兩種方式引用它:一種是前期綁定链蕊,另外一種是后期綁定稽物。
前期綁定:就是手工勾選工具/引用中的Microsoft VBScript Regular Expressions 5.5筷屡;
然后在代碼中定義對(duì)象:Dim regExp As New RegExp
;</br>
后期綁定:使用CreateObject方法定義對(duì)象:CreateObject("vbscript.regexp")
RegExp對(duì)象的屬性:
- Global – 設(shè)置或返回一個(gè)Boolean值鞠鲜,該值指明在整個(gè)搜索字符串時(shí)模式是全部匹配還是只匹配第一個(gè)户辫。如果搜索應(yīng)用于整個(gè)字符串,Global 屬性的值應(yīng)該為 True箍镜,否則其值為 False源祈。默認(rèn)的設(shè)置為True。
- Multiline – 返回正則表達(dá)式是否具有標(biāo)志, 缺省值為False色迂。如果指定的搜索字符串分布在多行香缺,這個(gè)屬性是要設(shè)置為True的。
- IgnoreCase – 設(shè)置或返回一個(gè)Boolean值歇僧,指明模式搜索是否區(qū)分大小寫赫悄。如果搜索是區(qū)分大小寫的,則IgnoreCase 屬性應(yīng)該為False;否則應(yīng)該設(shè)為True埂淮。缺省值為True姑隅。
- Pattern – 設(shè)置或返回被搜索的正則表達(dá)式模式。被搜索的正則字符串表達(dá)式倔撞。它包含各種正則表達(dá)式字符讲仰。
RegExp對(duì)象的方法:
- Execute – 對(duì)指定的字符串執(zhí)行正則表達(dá)式搜索。需要傳入要在其上執(zhí)行正則表達(dá)式的文本字符串痪蝇。正則表達(dá)式搜索的設(shè)計(jì)模式是通過(guò)RegExp對(duì)象的Pattern來(lái)設(shè)置的鄙陡。Execute方法返回一個(gè)Matches集合,其中包含了在string中找到的每一個(gè)匹配的Match對(duì)象躏啰。如果未找到匹配趁矾,Execute將返回空的Matches集合。
- Replace – 替換在正則表達(dá)式查找中找到的文本给僵。
- Test – 對(duì)指定的字符串執(zhí)行一個(gè)正則表達(dá)式搜索毫捣,并返回一個(gè)Boolean值指示是否找到匹配的模式。Global屬性對(duì)Test方法沒(méi)有影響帝际。如果找到了匹配的模式蔓同,Test方法返回True;否則返回False蹲诀。
- MatchCollection對(duì)象與Match對(duì)象
匹配到的所有對(duì)象放在MatchCollection集合中斑粱,這個(gè)集合對(duì)象只有兩個(gè)只讀屬性: - Count:匹配到的對(duì)象的數(shù)目
- Item:集合的又一通用方法,需要傳入Index值獲取指定的元素脯爪。
一般则北,可以使用ForEach語(yǔ)句枚舉集合中的對(duì)象。集合中對(duì)象的類型是Match痕慢。 - Match對(duì)象有以下幾個(gè)只讀的屬性:
- FirstIndex – 匹配字符串在整個(gè)字符串中的位置尚揣,值從0開始。
- Length – 匹配字符串的長(zhǎng)度守屉。
- Value – 匹配的字符串惑艇。
- SubMatches – 集合,匹配字符串中每個(gè)分組的值拇泛。作為集合類型滨巴,有Count和Item兩個(gè)屬性。
Sample Code(前期綁定):
Private Function IsStringDate(ByVal strDate As String)
Dim strDatePattern
' 前期綁定
Dim regEx As New RegExp, matches
Dim str MatchContent As String
strDatePattern = "^(([0-9])|([0-2][0-9])|([3][0-1]))\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\-\d{4}$"
With regEx
.Global = True ' 搜索字符串中的全部字符俺叭,如果為假恭取,則找到匹配的字符就停止搜索!
.MultiLine = False ' 是否指定多行搜索
.IgnoreCase = True ' 指定大小寫敏感(True)
.Pattern = strDatePattern ' 所匹配的正則
End With
If regEx.Test(strDate) Then ' 如果與正則相匹配
Set matches = regEx.Execute(strDate)
MatchContent = matches(0).Value
Else
MatchContent = "Not Matched"
End If
IsStringDate = regEx.Test(strDate)
End Function
Sample Code(后期綁定):
Function ExtractNumber(str As String) As String
Dim regEx As Object
Set regEx = CreateObject("vbscript.regexp") ' 后期綁定
With regEx
.Global = True ' 搜索字符串中的全部字符熄守,如果為假蜈垮,則找到匹配的字符就停止搜索耗跛!
.Pattern = "\D" ' 非數(shù)字字符的正則表達(dá)式
ExtractNumber = .Replace(str, "") ' 把非數(shù)字字符替換成空字符串
End With
Set regEx = Nothing ' 清除內(nèi)存中的對(duì)象變量的地址,即釋放內(nèi)存攒发。
End Function