excelvba正則表達(dá)式從實(shí)例開始_第1頁
excelvba正則表達(dá)式從實(shí)例開始_第2頁
excelvba正則表達(dá)式從實(shí)例開始_第3頁
excelvba正則表達(dá)式從實(shí)例開始_第4頁
excelvba正則表達(dá)式從實(shí)例開始_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、EXCEL VBA正則表達(dá)式從實(shí)例開始所有代碼都測試過,2011-09-09 : '2010-08-08 :'數(shù)據(jù)驗(yàn)證經(jīng)常出現(xiàn)的情況是,需要驗(yàn)證和處理大量的文本 內(nèi)容,有時(shí)候需要查找字符串,有時(shí)候要按條件替換,并且這些待處理的問題還是有一定的規(guī)律可循的,但是無法通過枚舉的方式挨個(gè)驗(yàn)證,這個(gè)時(shí)候就需要正則表達(dá)式來幫忙。,1.正則表達(dá)式(Regular Expression) 基礎(chǔ),正則表達(dá)式是通用的文本搜索和處理方案,它的知識不是VBA獨(dú)有的,基本上每種語言都內(nèi)置了正則表達(dá)式的功能。正則表達(dá)式的基礎(chǔ)知識不是這里的重點(diǎn),需要的朋友可以 Google 一下,或者參看下面的一些入門教程

2、: 'tutorials/regex/'''中的正則表達(dá)式應(yīng)用, 在VBA中使用正則表達(dá)式,可以通過下列途徑實(shí)現(xiàn): ,創(chuàng)建正則表達(dá)式對象:,前期綁定:在VBA代碼編輯器中的"Tools"菜單中,選中"References.",然后引用Microsoft VBScript Regular Expressions類庫,然后直接定義對象: Dim reg As NewRegExp '后期綁定:使用 CreateObject方法定義對象: CreateObject("") 。,前一種方式的優(yōu)點(diǎn)是可以有編

3、輯器的Intellisense 支持'RegExp對象的屬性:,Global -設(shè)置或返回一個(gè) Boolean值,該值指明在整個(gè)搜索字符串時(shí)模式是全部匹配還是只匹配第一個(gè)。如果搜索應(yīng)用于整個(gè)字符串,Global屬性的值應(yīng)該為True ,否則其值為False。默認(rèn)的設(shè)置為True。,Multiline -返回正則表達(dá)式是否具有標(biāo)志m,缺省值為False。如果指定的搜索字符串分布在多行,這個(gè)屬性是要設(shè)置為True的。,IgnoreCase -設(shè)置或返回一個(gè) Boolean值,指明模式搜索是否區(qū)分大小寫。如果搜索是區(qū) 分大小寫的,則IgnoreCase 屬性應(yīng)該為False ;否則應(yīng)該設(shè)為

4、True。缺省值為True。 ,pattern -設(shè)置或返回被搜索的正則表達(dá)式模式。被搜索的正則字符串表達(dá)式。它包含各種正則表達(dá)式字符。,RegExp對象的方法:Execute -對指定的字符串執(zhí)行正則表達(dá)式搜索。需要傳入要在其上執(zhí)行正則表達(dá)式的文本字符串。正則表達(dá)式搜索的設(shè)計(jì)模式是通過RegExp對象的Pattern 來設(shè)置的。Execute方法返回一個(gè) Matches集合,其中包含了在string 中找到的每一個(gè)匹配的 Match對象。如 果未找到匹配,Execute將返回空的 Matches集合。,Replace -替換在正則表達(dá)式查找中找到的文本Test -對指定的字符串執(zhí)行一個(gè)正則表

5、達(dá)式搜索,并返回一個(gè) Boolean值指示是否找到匹配的模式。屬性對 Test方法沒有影響。如果找到了匹配的模式,Test方法返回True;否則返回False。,MatchCollection對象與 Match 對象,匹配到的所有對象放在MatchCollection集合中,這個(gè)集合對象只有兩個(gè)只讀屬性:,Count:匹配到的對象的數(shù)目,|tem :集合的又一通用方法,需要傳入Index值獲取指定的元素。'一般,可以使用 For Each語句枚舉集合中的對象。集合中對象的類型是Match。,Match對象有以下幾個(gè)只讀的屬性:,FirstIndex -匹配字符串在整個(gè)字符串中的位置,值

6、從0開始。,Length -匹配字符串的長度,Value -匹配的字符串'SubMatches - 集合,匹配字符串中每個(gè)分組的值。作為集合類型,有 Count和Item兩個(gè) 屬性。 ,常用的正則表達(dá)式主要有以下幾種:,匹配中文字符的正則表達(dá)式:u4e00-u9fa5,評注:匹配中文還真是個(gè)頭疼的事,有了這個(gè)表達(dá)式就好辦了'匹配雙字節(jié)字符 (包括漢字在內(nèi)):Ax00-xff,評注:可以用來計(jì)算字符串的長度(一個(gè)雙字節(jié)字符長度計(jì)2, ASCII字符計(jì)1),匹配空白行的正則表達(dá)式:ns*r,評注:可以用來刪除空白行'匹配 HTMLfe記的正則表達(dá)式:<(S*)a>

7、;*>.*</>|<.* />,評注:網(wǎng)上流傳的版本太糟糕,上面這個(gè)也僅僅能匹配部分,對于復(fù)雜的嵌套標(biāo)記依舊無 能為力,匹配首尾空白字符的正則表達(dá)式:As*|s*$,評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達(dá)式'匹配 Email 地址的正則表達(dá)式:w+(-+.w+)*w+(-.w+)*.w+(-.w+)*,評注:表單驗(yàn)證時(shí)很實(shí)用'匹配網(wǎng)址URL的正則表達(dá)式:a-zA-z+:d+.d+.d+,評注:提取ip地址時(shí)有用,匹配特定數(shù)字:'A1-9d*$d*|0.d*1-9d*$d*|0.d*1-9d*)$

8、d*|0.d*1-9d*|0.0+|0)$d*|0.d*1-9d*|0.0+|0$d*|0.d*1-9d*)|0.0+|0$'w匹配字母或數(shù)字或下劃線或漢字,s匹配任意的空白符,d 匹配數(shù)字,b匹配單詞的開始或結(jié)束'A匹配字符串的開始,$匹配字符串的結(jié)束,表2.常用的限定符'代碼/語法 說明,*重復(fù)零次或更多次,重復(fù)一次或更多次+,Print重復(fù)零次或一次,n 重復(fù)n次,n,重復(fù)n次或更多次,n,m重復(fù)n到m次,表3.常用的反義代碼'代碼/語法 說明'W 匹配任意不是字母,數(shù)字,下劃線,漢字的字符'S匹配任意不是空白符的字符'D匹配任意非

9、數(shù)字的字符'B匹配不是單詞開頭或結(jié)束的位置'Ax匹配除了 x以外的任意字符,Aaeiou匹配除了 aeiou這幾個(gè)字母以外的任意字符',表4.常用分組語法'代碼/語法 說明 分類,(exp) 匹配exp,并捕獲文本到自動(dòng)命名的組里捕獲'(<name>exp) 匹配exp,并捕獲文本到名稱為 name的組里,也可以寫成('name'exp),(:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號'(=exp) 匹配exp前面的位置 零寬斷言'(<=exp)匹配exp后面的位置'(!exp)匹

10、配后面跟的不是 exp的位置'(<!exp)匹配前面不是exp的位置,(#comment)這種類型的分組不對正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀注釋 ,表5.懶惰限定符'代碼/語法 說明,*重復(fù)任意次,但盡可能少重復(fù),+ 重復(fù)1次或更多次,但盡可能少重復(fù),重復(fù)0次或1次,但盡可能少重復(fù),n,m)重復(fù)n到m次,但盡可能少重復(fù),n,重復(fù)n次以上,但盡可能少重復(fù),表6.常用的處理選項(xiàng),名稱說明,IgnoreCase(忽略大小寫)匹配時(shí)不區(qū)分大小寫。,Multiline(多行模式)更改人和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個(gè)字符串的開頭和結(jié)

11、尾匹配。(在此模式下,$的精確含意是:匹配n之前的位置以及字符串結(jié)束前的位置.),Singleline(單行模式) 更改.的含義,使它與每一個(gè)字符匹配(包括換行符n )。,IgnorePatternWhitespace(忽略空白)忽略表達(dá)式中的非轉(zhuǎn)義空白并啟用由#標(biāo)記的注釋。,ExplicitCapture(顯式捕獲)僅捕獲已被顯式命名的組。,表7.尚未詳細(xì)討論的語法'代碼/語法 說明'a報(bào)警字符(打印它的效果是電腦嘀一聲),b通常是單詞分界位置,但如果在字符類里使用代表退格't制表符,Tab'r 回車'v豎向制表符'f 換頁符'n 換行

12、符'e Escape'0nn ASCII代碼中八進(jìn)制代碼為 nn的字符'xnn ASCII代碼中十六進(jìn)制代碼為 nn的字符'unnnn Unicode代碼中十六進(jìn)制代碼為nnnn的字符'cN ASCII 控制字符。比如cC代表Ctrl+C'A 字符串開頭(類似人,但不受處理多行選項(xiàng)的影響)'Z字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響)'z 字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響)'G當(dāng)前搜索的開頭'pname Unicode中命名為 name的字符類,例如 pIsGreek'(>exp) 貪婪子

13、表達(dá)式'(<x>-<y>exp)平衡組'(im-nsx:exp)在子表達(dá)式exp中改變處理選項(xiàng),(im-nsx)為表達(dá)式后面的部分改變處理選項(xiàng),(exp)yes|no)把exp當(dāng)作零寬正向先行斷言,如果在這個(gè)位置能匹配,使用yes作為此組的表達(dá)式;否則使用 no,(exp)yes) 同上,只是使用空表達(dá)式作為no,(name)yes|no)如果命名為name的組捕獲到了內(nèi)容,使用 yes作為表達(dá)式;否則使用 no,(name)yes) 同上,只是使用空表達(dá)式作為no',在VBA中使用正則表達(dá)式,可以通過下列途徑實(shí)現(xiàn):,創(chuàng)建正則表達(dá)式對象:'

14、;前期綁定:在 VBA代碼編輯器中的"Tools"菜單中,選中"References.",然后引用 Microsoft VBScript Regular Expressions類庫,然后直接定義對象:Dim reg As NewRegExp'后期綁定:使用 CreateObject方法定義對象:CreateObject("") 。,前一種方式的優(yōu)點(diǎn)是可以有編輯器的Intellisense 支持'RegExp對象的屬性:,Global -設(shè)置或返回一個(gè) Boolean值,該值指明在整個(gè)搜索字符串時(shí)模式是全部匹配還是只匹配

15、第一個(gè)。如果搜索應(yīng)用于整個(gè)字符串,Global屬性的值應(yīng)該為True ,否則其值為False。默認(rèn)的設(shè)置為True。,Multiline -返回正則表達(dá)式是否具有標(biāo)志m,缺省值為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對象的方法:,E

16、xecute -對指定的字符串執(zhí)行正則表達(dá)式搜索。需要傳入要在其上執(zhí)行正則表達(dá)式的文本字符串。正則表達(dá)式搜索的設(shè)計(jì)模式是通過RegExp對象的Pattern 來設(shè)置的。Execute方法返回一個(gè)Matches集合,其中包含了在 string 中找到的每一個(gè)匹配的 Match對象。如 果未找到匹配,Execute將返回空的 Matches集合。,Replace -替換在正則表達(dá)式查找中找到的文本,Test -對指定的字符串執(zhí)行一個(gè)正則表達(dá)式搜索,并返回一個(gè)Boolean值指示是否找到匹配的模式。屬性對 Test方法沒有影響。如果找到了匹配的模式,Test方法返回True;否則返回False。&#

17、39;MatchCollection 對象與 Match 對象,匹配到的所有對象放在MatchCollection 集合中,這個(gè)集合對象只有兩個(gè)只讀屬性:,Count: 匹配到的對象的數(shù)目,Item :集合的又一通用方法,需要傳入Index值獲取指定的元素。,一般,可以使用 For Each語句枚舉集合中的對象。集合中對象的類型是Match。,Match對象有以下幾個(gè)只讀的屬性:,FirstIndex -匹配字符串在整個(gè)字符串中的位置,值從0開始。Length -匹配字符串的長度Value -匹配的字符串,SubMatches - 集合,匹配字符串中每個(gè)分組的值。作為集合類型,有 Count和

18、Item兩個(gè) 屬性。 ,正則表達(dá)式很強(qiáng)大,是處理文本的首選,不管你信不信,反正我是信了。說了很多, ,最后以一個(gè)小例子結(jié)尾吧:Sub Test()Dim reg As New RegExpWith reg.Global = True.IgnoreCase = True.Pattern = "d+"End WithDim mc As MatchCollectionDim m As matchSet mc = ("123aaaaa987uiiui999")For Each m In mcMsgBoxNextEnd SubFunction ExReplace(

19、sStr As String,正則表達(dá)式替換,參數(shù)說明:sStr原字符串,sReplStr,返回參數(shù),返回替換后的值Dim regEX As ObjectSet regEX = CreateObject("") 'RegEx=True,sReplStr As String, sPatrn As String) As String將替換的字符串,sPatrn樣式為建立正則表達(dá)式 設(shè)置全局可用=sPatrn'設(shè)置樣式ExReplace = (sStr, sReplStr)'執(zhí)行替換Set regEX = NothingEnd FunctionFuncti

20、on ExExce(sStr As String, sPatrn As String, Optional IC As Boolean = True, Optional G As Boolean = True) As Object,正則表達(dá)式搜索'參數(shù)說明:sStr原字符串,Patrn樣式,IC是否區(qū)別大小寫,G是否全局可用 '返回參數(shù),返回的是一個(gè)對象,是搜索的數(shù)量n>=0'ExExce(n).FirstIndex搜索白第n個(gè)串的位置,'ExExce(n).Value搜索白第n個(gè)串的值,n>=0Dim regEX As ObjectSet regEX

21、 = CreateObject("") 'RegEx為建立正則表達(dá)式=True'設(shè)置全局可用=sPatrn'設(shè)置樣式=IC'設(shè)置是否區(qū)分大小寫。Set ExExce = (sStr) '執(zhí)行搜索Set regEX = NothingEnd FunctionFunction ExTest(sStr As String, sPatrn As String, IC As Boolean) As Boolean'正則表達(dá)式匹配'VBA代碼'參數(shù)說明:sStr原字符串,Patrn樣式,IC是否區(qū)別大小寫'返回參數(shù)

22、,返回一個(gè)邏輯值,True為匹配,F(xiàn)alse為不匹配Dim regEX As ObjectSet regEX = CreateObject("") 'RegEx為建立正則表達(dá)式=True=sPatrn=IC'ExTest = (sStr)Set regEX = NothingEnd FunctionPublic Sub 去重復(fù)()Dim ss, re, rv設(shè)置全局可用設(shè)置樣式設(shè)置是否區(qū)分大小寫。執(zhí)行搜索測試ss = "Is is the cost of of gasoline going up up." & vbNewLine

23、Set re = New RegExp="b(a-z+) 1b”=True=True=Truerv = (ss, "$1")MsgBox rvEnd SubFunction RegExpTest(patrn, strng)'正則表達(dá)式(RegExp)對象 ,提供簡單的正則表達(dá)式支持功能 '下面的代碼說明了 RegExp對象的用法:Dim regEX, match, matches'Set regEX = New RegExp'=patrn'=True'=True'Set matches = (strng)&#

24、39;For Each match In matches'retStr = retStr & "Match found at position " retStr = retStr & & ". Match Value is '"建立變量。建立正則表達(dá)式。設(shè)置模式。設(shè)置是否區(qū)分字符大小寫。設(shè)置全局可用性。執(zhí)行搜索。遍歷匹配集合。retStr = retStr & & ",." & vbCrLfNextRegExpTest = retStrEnd Function '

25、Global 屬性,設(shè)置或返回一個(gè) Boolean值,該值指明在整個(gè)搜索字符串時(shí)模式是全部匹配還是只匹配第 一個(gè)。'=True | False '對象參數(shù)總是RegExp對象。如果搜索應(yīng)用于整個(gè)字符串,Global屬性的值為True ,否則其值為False。默認(rèn)的設(shè)置為 False。'下面的代碼說明了 Global屬性的用法(改變賦予Global屬性的值并觀察其效果):Function RegExpTest1(patrn, strng) Dim regEX, match, matches Set regEX = New RegExp =patrn'=True&#

26、39;=True'Set matches = (strng) ' For Each match In matches建立變量。建立規(guī)范表達(dá)式。設(shè)置模式。設(shè)置是否區(qū)分字母的大小寫。設(shè)置全程性質(zhì)。執(zhí)行搜索。重復(fù)匹配集合retStr = retStr & "Match found at position RetStr=RetStr&&".Match Value is '"RetStr=RetStr&&"'."&vbCRLF NextRegExpTest = retStrE

27、nd Function'IgnoreCase 屬性'設(shè)置或返回一個(gè) Boolean值,指明模式搜索是否區(qū)分大小寫。'=True | False 'Object參數(shù)總是一個(gè) RegExp對象。如果搜索是區(qū)分大小寫的,則IgnoreCase 屬性為False ;否則為 True。缺省值為 False 。'說明' 下面的代碼說明了 IgnoreCase 屬性的用法(改變賦予IgnoreCase 屬性的值以觀察其效果):Function RegExpTest2(patrn, strng)Dim regEX, match, matchesSet regEX

28、 = New RegExp= patrn'= True'= True'Set matches = (strng) 'For Each match In matches建立變量。建立正則表達(dá)式。設(shè)置模式。設(shè)置不區(qū)分大小寫。設(shè)置全局可用性執(zhí)行搜索。重復(fù)匹配集合retStr = retStr & "Match found at position RetStr=RetStr&&".Match Value is '"RetStr=RetStr&&"'."&vb

29、CRLFNextRegExpTest = retStrEnd Function'Execute 方法對指定的字符串執(zhí)行正則表達(dá)式搜索'(string)參數(shù)'Object'必選項(xiàng)。總是一個(gè)RegExp對象的名稱。'string'必選項(xiàng)要在其上執(zhí)行正則表達(dá)式的文本字符串'說明'正則表達(dá)式搜索的設(shè)計(jì)模式是通過RegExp對象的Pattern 來設(shè)置的。'Execute 方法返回一個(gè)Matches集合,其中包含了在string中找到的每一個(gè)匹配的Match對象。如果未找到匹配,Execute將返回空的 Matches集合。卜面的代

30、碼說明了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.

31、For Each match In matches ' Iterate Matches collection.retStr = retStr & "Match found at position retStr = retStr & & ". Match Value is '" retStr = retStr & & "." & vbCrLfNextRegExpTest = retStrEnd Function'Replace 方法替換在正則表達(dá)式查找中找到的文本'(

32、string1, string2)'Object,必選項(xiàng)??偸且粋€(gè)RegExp對象的名稱。'stringl'必選項(xiàng)stringl是將要進(jìn)行文本替換的字符串'string2'必選項(xiàng)。string2是替換文本字符串。'說明'被替換的文本的實(shí)際模式是通過RegExp對象的Pattern屬性設(shè)置的。'Replace 方法返回stringl的副本,其中的 文本已經(jīng)被替換為 string2 。如果沒有找到匹配的文本,將返回原來的stringl的副本。'下面的例子說明了Replace方法的用法。建立變量。Function Replace

33、Test4(patrn, replStr)Dim regEX, str1str1 = "The quick brown fox jumped over the lazy dog.建立正則表達(dá)式。設(shè)置模式。設(shè)置是否區(qū)分大小寫。作替換。將'fox' 替換為Set regEX = New RegExp = patrn'= True'ReplaceTest = (str1, replStr) End Function 'MsgBox(ReplaceTest("fox", "cat") 'cat'。

34、'另外,Replace方法在模式中替換subexpressions 。 下面對以前示例中函數(shù)的調(diào)用,替換了原字符串中的所有字對:'MsgBox (ReplaceText("(S+)(s+)(S+)", "$3$2$1")'交換詞對.'test 方法'對指定的字符串執(zhí)行一個(gè)正則表達(dá)式搜索,并返回一個(gè)Boolean值指示是否找到匹配的模式。'(string)'參數(shù)'Object'必選項(xiàng)??偸且粋€(gè)RegExp對象的名稱。'string'必選項(xiàng)要執(zhí)行正則表達(dá)式搜索的文本字符串

35、'說明'正則表達(dá)式搜索的實(shí)際模式是通過RegExp對象的Pattern屬性來設(shè)置的屬性對 Test方法沒有影響'如果找到了匹配的模式,Test方法返回True;否則返回False。'下面的代碼說明了 Test方法的用法Function RegExpTest5(patrn, strng)Dim regEX, retVal'建立變量。Set regEX = New RegExp'建立正則表達(dá)式。=patrn'設(shè)置模式。設(shè)置是否區(qū)分大小寫。執(zhí)行搜索測試。找到一個(gè)或多個(gè)匹配。"未找到匹配。"=False retVal = (s

36、trng) If retVal ThenRegExpTest = ElseRegExpTest = End IfEnd Function'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4")'Match對象'提供了對正則表達(dá)式匹配的只讀屬性的訪問'說明'Match對象只能通過 RegExp對象的Execute 方法來創(chuàng)建,該方法實(shí)際上返回了Match對象的集合。所有的 Match對象屬性都是只讀的。在執(zhí)行正則表達(dá)式時(shí),可能產(chǎn)生零個(gè)或多個(gè)Match對象。每個(gè) Match對象提供了被

37、正則表達(dá)式搜索找到的字符串的訪問、字符串的長度,以及找到匹配的索引位置等。'下面的代碼說明了Match對象的用法:Function RegExpTest6(patrn, strng)Dim regEX, match, matches '建立變量。Set regEX = New RegExp '建立正則表達(dá)式。=patrn '設(shè)置模式。=True '設(shè)置是否區(qū)分大小寫。=True '設(shè)置全局替換。Set matches = (strng) '執(zhí)行搜索。For Each match In matches'遍歷 Matches 集合。r

38、etStr = retStr & "Match " & i & " found at position "retStr = retStr & & ". Match Value is "'retStr = retStr & & "." & vbCrLfNextRegExpTest = retStrEnd Function'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4&q

39、uot;)'Matches 集合'正則表達(dá)式Match對象的集合。 ''說明'Matches 集合中包含若干獨(dú)立的Match 對象,只能使用 RegExp對象的Execute 方法來創(chuàng)建之。與獨(dú)立的Match對象屬性相同,Matches '集合的一個(gè)屬性是只讀的。'在執(zhí)行正則表達(dá)式時(shí),可能產(chǎn)生零個(gè)或多個(gè)Match對象。每個(gè) Match對象都提供了與正則表達(dá)式匹配的字符串的訪問入口、字符串的長度,以及標(biāo)識匹配位置的索弓I。,下面的代碼將說明如何使用正則表達(dá)式查找獲得Function RegExpTest7(patrn, strng)Dim

40、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 & & ",." &am

41、p; vbCrLfNextRegExpTest = retStr End Function 'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4")'SubMatches8 集合,正則表達(dá)式子匹配字符串的集合 ,說明'SubMatches集合包含了單個(gè)的子匹配字符串, SubMatches集合的屬性是只讀的。Matches集合,以及如何循環(huán)遍歷集合:創(chuàng)建變量。創(chuàng)建正則表達(dá)式。設(shè)置模式。設(shè)置是否區(qū)分大小寫。設(shè)置全程匹配。執(zhí)行搜索。循環(huán)遍歷Matches只能用RegExp對象的Execute 方法創(chuàng)建

42、。'運(yùn)行一個(gè)正則表達(dá)式時(shí),當(dāng)圓括號中捕捉到子表達(dá)式時(shí)可以有零個(gè)或多個(gè)子匹配。'SubMatches集合中的每一項(xiàng)是由正則表達(dá)式找到并捕獲的的字符串。'下面的代碼演示了如何從一個(gè)正則表達(dá)式獲得一個(gè)SubMatches集合以及如何操作它的專有成員:Sub MatchTest8() inpStr = ""Dim oRe, oMatch, oMatchesSet oRe = New RegExp'查找一個(gè)電子郵件地址(不是一個(gè)理想的RegExp)="(w+)(w+).(w+)”' 得到Matches集合Set oMatches =

43、(inpStr)' 因?yàn)橹挥幸粋€(gè)地址,所以,集合只有一項(xiàng),就是索引 =0 的那個(gè)' 得到Matches集合中的第一項(xiàng)Set oMatch = oMatches(0)' 創(chuàng)建結(jié)果字符串。' Match對象是完整匹配retStr ="電子郵件地址是:"& oMatch & vbNewLine,得到地址的子匹配部分。retStr = retStr & "電子郵件別名是:"& (0)' dragonretStr = retStr & vbNewLineretStr = retStr

44、& "組織是:"& (1)' xyzzySubMatchTest = retStrMsgBox retStr謝謝!")End Sub'MsgBox(SubMatchTest("請寫信到。Sub jj1(),把數(shù)字篩選出來不包含括號的數(shù)字Dim kk()Set x = CreateObject("")=1"A(.*)(.*"For Each y In a2:h2 ReDim Preserve kk(1 To j) If (y) ThenSet mchs = (y)Set mc = mc

45、hs(0)retStr = (0)kk(j) = Val(retStr)j = j + 1 End IfNextMsgBox (kk)End SubSub jj(),把數(shù)字篩選出來不包含括號的數(shù)字Dim kk()Set x = CreateObject("")=1"A(.*)(.*"j = 1For Each y In a2:h2ReDim Preserve kk(1 To j)If (y) Thenkk(j) = Val(y)(0).SubMatches(0) j = j + 1End IfNextMsgBox (kk)End SubSub刪除空格()

46、Dim reg As ObjectDim arrDim i As Integerrw = Range("A65536 ).End(xlUp).RowColumns("B").ClearContentsarr = Range("A1:A" & rw)Set reg = CreateObject("")With reg.Global = True.IgnoreCase = True.Pattern = "A ",符合樣式就用""替換End WithFor i = 1 To UBou

47、nd(arr)Range("B" & i) = (arr(i, 1),"")NextEnd Sub,過程刪除空格(), 定義變量reg 為對象' 定義變量arr, 定義變量i為長整型值,j 為長整型值'i = 單元格區(qū)域(“a65536).結(jié)束(方向向上).行標(biāo),列坐標(biāo)(“b”).清除內(nèi)容'arr =單元格區(qū)域("a1:a" & i)' 設(shè)置 reg = 創(chuàng)建對象("vbscript . regexp ")' 工作于reg,. 全局=True'. 忽略

48、大小寫=True'. 樣式="人”,結(jié)束工作于,循環(huán)范圍j = 1 到i,單元格區(qū)域(“b" & j) = reg . 替換字符串(arr(j ,1),"")' 下一句' 結(jié)束過程,正則表達(dá)式示例1提取字符串中的數(shù)字Sub getNum1(),這種使用方式需要"工具""引用",弓 I用 Microsoft VBScript Regular Expressions 類庫Dim reg As New RegExpWith reg.Global = True.IgnoreCase = Tr

49、ue.Pattern = "d+"End WithDim mc As MatchCollectionDim m As matchSet mc = ("123aaaaa987uiiui999")For Each m In mcMsgBox + 1NextEnd Sub,正則表達(dá)式示例 2用"字符串"替換原字符串中符合匹配模式的部分Sub getNum2()字符串,"分隔符")Dim arrarr = Split("A12B-R1E2W-E1T-R2T-Q1B2Y3U4D", "-&quo

50、t;) ' split(拆分字符串With CreateObject("")'For i = 0 To UBound(arr) .Global = True ' .Pattern = "FA-Z"' sr = .Replace(arr(i),"")' 換為空字符c = c & sr & ""NextEnd With生成一個(gè)正則表達(dá)式對象實(shí)例設(shè)置全局可用,即替換所有符合匹配模式的字符串 匹配模式為非大寫字母將 arr(i)字符串中符合匹配模式的部分替MsgBox

51、 cEnd SubFunction zldccmx(rng As Range, Ms As Integer) Dim ys(1 To 12): Dim regEXys(1) = "AA-Za-z0-9"'只保留字母和數(shù)字ys(2) = "。-"' ys(3) = "!-w"ys(4) = "d"' ys(5) = "Ad"' ys(6) = "D"'ys(7) = "a-zA_Z"' ys(8) = &quo

52、t;3*a*”' ys(9) = "36*"' ys(10) = "A3"' ys(11) = "A0-9."'去除中文留中文(留數(shù)字)去除英文大小寫字符去除所有指定字符,這里指去除去除所有指定字符,這里指去除3和a"36"去除所有非特定字符,這里指去除不是3的字符只保留數(shù)字和小數(shù)點(diǎn)保留數(shù)字和運(yùn)算符號+-*/a'RegEx為建立正則表達(dá)式y(tǒng)s(12) = "A0-9/.+-a*a"'Set regEX = CreateObject("&q

53、uot;)=True '設(shè)置全局可用=ys(Ms)' 樣式zldccmx = (rng,"")Set regEX = Nothing End Function'問題:字符串中1個(gè)或者連續(xù)多個(gè)空格替換成一個(gè)Tab鍵'分析:由于字符串中連續(xù)的空格的個(gè)數(shù)不太確定,如果我們逐個(gè)字符去分析的話, 也是比較麻煩的,但如果用正則去實(shí)現(xiàn),則簡單的多。這也是一個(gè)典型的適合用正則解決 的問題。,解決方式如下:Sub Test7()Dim regEX As Object, strstr = "abc de fg"Set regEX = Crea

54、teObject("")With regEX.Global = True.Pattern = "'s+"End With st = (str,"") MsgBox st Set regEX = NothingEnd SubSub test1()Dim strSet reg = CreateObject("")=True="d9”str = "aaaaaaa9qqqqqqqqqqqq1aaaa"Set col = (str)If > 0 ThenFor Each mch I

55、n col sm = sm & & ""NextEnd IfMsgBox sm End SubSub r_1()'1) Global 屬性,False,如果找到匹配的字符,就停止搜索(默認(rèn)值),True,搜索字符串中全部字符Dim regEX As ObjectDim x As String x = "a1b2c3”Set regEX = CreateObject("")With regEX .Global = True '.Global = False ' .Pattern = "d"

56、;MsgBox .Replace(x, "#")End WithEnd Sub'2) IgnoreCase 屬性'如果搜索是區(qū)分大小寫的,為 'True不分Sub r_2()Dim regEX As ObjectDim x As Stringx = "a1A2"Set regEX = CreateObject("")With regEX .Global = True .IgnoreCase = True '.IgnoreCase = False ' .Pattern = "A"

57、;'MsgBox .Replace(x, "#")End WithEnd Sub'3) Multiline 屬性' 返回正則表達(dá)式是否具有標(biāo)志Sub r_3()Dim regEX As ObjectDim x As Stringx = "a1b2" & Chr(13) & "c3d4" Set regEX = CreateObject("") With regEX .Global = True ' .MultiLine = True .Pattern = "

58、d+$" MsgBox .Replace(x, "#")End With返回"a#b#c#"返回"a#b2c3”數(shù)字字符匹配False (缺省值)返回"#1#2"返回"ab#2"數(shù)字字符匹配m ,缺省值為FalseEnd Sub'4) Pattern 屬性'一個(gè)字符串,用來定義正則表達(dá)式。缺省值為空文本。'5) Execute 方法' 返回一個(gè)MatchCollection 對象,該對象包含每個(gè)成功匹配的Match對象。Sub r_5()Dim regEX As

59、ObjectDim matchs As Object, match As ObjectDim x As String, y As String x = "alb2c3”Set regEX = CreateObject("")With regEX .Global = True .Pattern = "d"'匹配數(shù)字Set matchs = .Execute(x) For Each match In matchsy = y & match NextEnd WithMsgBox y 'y 返回 123 End Sub '

60、;6) Test 方法'返回一個(gè)布爾值,該值指示正則表達(dá)式是否與字符串成功匹配。Sub r_6()Dim regEX As ObjectDim x As String, y As StringDim i As Integer x = "alb2c3” 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 iE

61、nd WithMsgBox y'y返回 123End SubPublic Sub ty2()'提取英文字母并去重復(fù)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 = "(.)11," str = .Replace(str, "$1")End With strEnd Sub'把文件中的空白行去掉:假設(shè)d盤有一個(gè)文本,內(nèi)容如下7 6 2 9 5 8 3 4 19 3 1 4 2 7 8 5 66 9 3 8 7 5 1 2 45 1 8 3 4 2 6 9 72 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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論