在VBA中使用正則表達(dá)式受限需要引用Microsoft VBScript Regular Expressions 5.5類庫。在VBA界面,“工具”-->“引用”,
定義正則表達(dá)式,如下例:
Dim reg As New regexp
With reg
.Global = True
.IgnoreCase = True
.MultiLine = False
.Pattern = "[^\u4E00-\u9FA50-9A-Za-z]+" ‘匹配所有非漢字、非數(shù)字0-9、非字母
End With
Content = reg.Replace(Content, ",") ‘將匹配的內(nèi)容用英文狀態(tài)逗號(hào)替換
匹配到的所有對(duì)象放在MatchCollection集合中,這個(gè)集合對(duì)象只有兩個(gè)只讀屬性:
Count:匹配到的對(duì)象的數(shù)目
Item:集合的又一通用方法,需要傳入Index值獲取指定的元素。
一般,可以使用For Each語句枚舉集合中的對(duì)象。集合中對(duì)象的類型是Match。
Match對(duì)象有以下幾個(gè)只讀的屬性:
FirstIndex - 匹配字符串在整個(gè)字符串中的位置,值從0開始。
Length - 匹配字符串的長度。
Value - 匹配的字符串。
SubMatches - 集合,匹配字符串中每個(gè)分組的值。作為集合類型,有Count和Item兩個(gè)屬性。
^[1-9]\d*$ //匹配正整數(shù)
^-[1-9]\d*$ //匹配負(fù)整數(shù)
^-?[1-9]\d*$ //匹配整數(shù)
^[1-9]\d*|0$ //匹配非負(fù)整數(shù)(正整數(shù) + 0)
^-[1-9]\d*|0$ //匹配非正整數(shù)(負(fù)整數(shù) + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮點(diǎn)數(shù)
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配負(fù)浮點(diǎn)數(shù)
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮點(diǎn)數(shù)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0)
評(píng)注:處理大量數(shù)據(jù)時(shí)有用,具體應(yīng)用時(shí)注意修正
14)匹配特定字符串:
^[A-Za-z]+$ //匹配由26個(gè)英文字母組成的字符串
^[A-Z]+$ //匹配由26個(gè)英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個(gè)英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數(shù)字和26個(gè)英文字母組成的字符串
^\w+$ //匹配由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串
【例1】匹配一次
Worksheets("sheet1").Activate
Content = "張三;李四!王武佳、高寒;陳慶,鄭強(qiáng)叁”曉紅。趙樓.金三峰"
Dim reg
Set reg = CreateObject("VBSCRIPT.REGEXP")
Dim mc As Match
reg.Pattern = "[\u4E00-\u9FA50-9A-Za-z]+"
Dim row As Integer
row = 1
If reg.test(Content) Then
Debug.Print reg.Execute(Content)(0).Value '輸出張三
End If
【例2】匹配所有滿足條件的內(nèi)容
Sub test()
Worksheets("sheet1").Activate
Content = "張三;李四!王武佳、高寒;陳慶,鄭強(qiáng)叁”曉紅。趙樓.金三峰"
Dim reg As New RegExp
Dim mc As MatchCollection
With reg
.Global = True
.IgnoreCase = True
.MultiLine = False
.Pattern = "[\u4E00-\u9FA50-9A-Za-z]+"
End With
Dim row As Integer
row = 1
If reg.test(Content) Then
Set mc = reg.Execute(Content)
For Each mt In mc
Cells(row, "J").Value = mt.Value
row = row + 1
Next
End If
End Sub
結(jié)果為:
【例三】匹配優(yōu)先 及非匹配優(yōu)先
Sub test()
Rem 匹配優(yōu)先(貪婪模式)
Dim str As String
str = "abcesfa"
Set reg = CreateObject("vbscript.regexp")
Dim mat As Match
reg.Pattern = "\w+"
result = reg.Execute(str)(0).value '結(jié)果為abcesfa
Debug.Print result
Rem 忽略匹配優(yōu)先(非貪婪模式)
reg.Pattern = "\w+?"
result = reg.Execute(str)(0).value '結(jié)果為a
Debug.Print result
End Sub
【例四】后向引用:找出所有年份相同的
Sub test()
Dim str As String
str = "張三20120212到20120922;李斯20110101到2020150909;王武2009到2009;金榮2008到2009"
Set reg = CreateObject("vbscript.regexp")
Dim mat As Match
reg.Pattern = "(\d{4})[^;]+\1+([^;]*)" //\1表示第一個(gè)括號(hào)匹配的內(nèi)容
reg.Global = True
For Each mat In reg.Execute(str)
Debug.Print mat.value
Next
End Sub
輸出結(jié)果:
20120212到20120922
2009到2009
【例五】正向環(huán)視:找出下面字符串中的所有金額,金額后面有單位“元”或“塊”
Sub test()
Dim str As String
str = "張三買了2把掃帚花了22.89元;李斯買了12個(gè)水杯花費(fèi)98.00塊錢"
Set reg = CreateObject("vbscript.regexp")
Dim mat As Match
reg.Pattern = "([\d|.]+)(?=[元|塊])"
reg.Global = True
For Each mat In reg.Execute(str)
Debug.Print mat.value
Next
End Sub
結(jié)果為:
22.89
98.00
【例六】正向否定環(huán)視:找出下面字符串中所有的字母組成的字符串
Sub test()
Dim str As String
str = "asdf張三vdajo?asdv李斯n213749fbi王武:"
Set reg = CreateObject("vbscript.regexp")
Dim mat As Match
reg.Pattern = "\w+(?![a-z])"
reg.Global = True
For Each mat In reg.Execute(str)
Debug.Print mat.value
Next
End Sub
結(jié)果為:
asdf
vdajo
asdv
n213749fbi
【例七】分組的應(yīng)用
Sub test()
Dim str As String
str = "財(cái)務(wù)部23人;后勤部32人;外交部20人"
Set reg = CreateObject("vbscript.regexp")
Dim mat As MatchCollection
reg.Pattern = "([\u4e00-\u9fa5]{3,})(\d+人)"
reg.Global = True
Set mat = reg.Execute(str)
For i = 0 To mat.Count - 1
Debug.Print mat(i).SubMatches(0) & ":" & mat(i).SubMatches(1)
Next
End Sub
結(jié)果為:
財(cái)務(wù)部:23人
后勤部:32人
外交部:20人
聯(lián)系客服