




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、EXCEL VBA正則表達式從實例開始所有代碼都測試過,2011-09-09 : '2010-08-08 :'數(shù)據(jù)驗證經(jīng)常出現(xiàn)的情況是,需要驗證和處理大量的文本 內(nèi)容,有時候需要查找字符串,有時候要按條件替換,并且這些待處理的問題還是有一定的規(guī)律可循的,但是無法通過枚舉的方式挨個驗證,這個時候就需要正則表達式來幫忙。,1.正則表達式(Regular Expression) 基礎,正則表達式是通用的文本搜索和處理方案,它的知識不是VBA獨有的,基本上每種語言都內(nèi)置了正則表達式的功能。正則表達式的基礎知識不是這里的重點,需要的朋友可以 Google 一下,或者參看下面的一些入門教程
2、: 'tutorials/regex/'''中的正則表達式應用, 在VBA中使用正則表達式,可以通過下列途徑實現(xiàn): ,創(chuàng)建正則表達式對象:,前期綁定:在VBA代碼編輯器中的"Tools"菜單中,選中"References.",然后引用Microsoft VBScript Regular Expressions類庫,然后直接定義對象: Dim reg As NewRegExp '后期綁定:使用 CreateObject方法定義對象: CreateObject("") 。,前一種方式的優(yōu)點是可以有編
3、輯器的Intellisense 支持'RegExp對象的屬性:,Global -設置或返回一個 Boolean值,該值指明在整個搜索字符串時模式是全部匹配還是只匹配第一個。如果搜索應用于整個字符串,Global屬性的值應該為True ,否則其值為False。默認的設置為True。,Multiline -返回正則表達式是否具有標志m,缺省值為False。如果指定的搜索字符串分布在多行,這個屬性是要設置為True的。,IgnoreCase -設置或返回一個 Boolean值,指明模式搜索是否區(qū)分大小寫。如果搜索是區(qū) 分大小寫的,則IgnoreCase 屬性應該為False ;否則應該設為
4、True。缺省值為True。 ,pattern -設置或返回被搜索的正則表達式模式。被搜索的正則字符串表達式。它包含各種正則表達式字符。,RegExp對象的方法:Execute -對指定的字符串執(zhí)行正則表達式搜索。需要傳入要在其上執(zhí)行正則表達式的文本字符串。正則表達式搜索的設計模式是通過RegExp對象的Pattern 來設置的。Execute方法返回一個 Matches集合,其中包含了在string 中找到的每一個匹配的 Match對象。如 果未找到匹配,Execute將返回空的 Matches集合。,Replace -替換在正則表達式查找中找到的文本Test -對指定的字符串執(zhí)行一個正則表
5、達式搜索,并返回一個 Boolean值指示是否找到匹配的模式。屬性對 Test方法沒有影響。如果找到了匹配的模式,Test方法返回True;否則返回False。,MatchCollection對象與 Match 對象,匹配到的所有對象放在MatchCollection集合中,這個集合對象只有兩個只讀屬性:,Count:匹配到的對象的數(shù)目,|tem :集合的又一通用方法,需要傳入Index值獲取指定的元素。'一般,可以使用 For Each語句枚舉集合中的對象。集合中對象的類型是Match。,Match對象有以下幾個只讀的屬性:,FirstIndex -匹配字符串在整個字符串中的位置,值
6、從0開始。,Length -匹配字符串的長度,Value -匹配的字符串'SubMatches - 集合,匹配字符串中每個分組的值。作為集合類型,有 Count和Item兩個 屬性。 ,常用的正則表達式主要有以下幾種:,匹配中文字符的正則表達式:u4e00-u9fa5,評注:匹配中文還真是個頭疼的事,有了這個表達式就好辦了'匹配雙字節(jié)字符 (包括漢字在內(nèi)):Ax00-xff,評注:可以用來計算字符串的長度(一個雙字節(jié)字符長度計2, ASCII字符計1),匹配空白行的正則表達式:ns*r,評注:可以用來刪除空白行'匹配 HTMLfe記的正則表達式:<(S*)a>
7、;*>.*</>|<.* />,評注:網(wǎng)上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復雜的嵌套標記依舊無 能為力,匹配首尾空白字符的正則表達式:As*|s*$,評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式'匹配 Email 地址的正則表達式:w+(-+.w+)*w+(-.w+)*.w+(-.w+)*,評注:表單驗證時很實用'匹配網(wǎng)址URL的正則表達式:a-zA-z+:d+.d+.d+,評注:提取ip地址時有用,匹配特定數(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.常用的限定符'代碼/語法 說明,*重復零次或更多次,重復一次或更多次+,Print重復零次或一次,n 重復n次,n,重復n次或更多次,n,m重復n到m次,表3.常用的反義代碼'代碼/語法 說明'W 匹配任意不是字母,數(shù)字,下劃線,漢字的字符'S匹配任意不是空白符的字符'D匹配任意非
9、數(shù)字的字符'B匹配不是單詞開頭或結(jié)束的位置'Ax匹配除了 x以外的任意字符,Aaeiou匹配除了 aeiou這幾個字母以外的任意字符',表4.常用分組語法'代碼/語法 說明 分類,(exp) 匹配exp,并捕獲文本到自動命名的組里捕獲'(<name>exp) 匹配exp,并捕獲文本到名稱為 name的組里,也可以寫成('name'exp),(:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號'(=exp) 匹配exp前面的位置 零寬斷言'(<=exp)匹配exp后面的位置'(!exp)匹
10、配后面跟的不是 exp的位置'(<!exp)匹配前面不是exp的位置,(#comment)這種類型的分組不對正則表達式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀注釋 ,表5.懶惰限定符'代碼/語法 說明,*重復任意次,但盡可能少重復,+ 重復1次或更多次,但盡可能少重復,重復0次或1次,但盡可能少重復,n,m)重復n到m次,但盡可能少重復,n,重復n次以上,但盡可能少重復,表6.常用的處理選項,名稱說明,IgnoreCase(忽略大小寫)匹配時不區(qū)分大小寫。,Multiline(多行模式)更改人和$的含義,使它們分別在任意一行的行首和行尾匹配,而不僅僅在整個字符串的開頭和結(jié)
11、尾匹配。(在此模式下,$的精確含意是:匹配n之前的位置以及字符串結(jié)束前的位置.),Singleline(單行模式) 更改.的含義,使它與每一個字符匹配(包括換行符n )。,IgnorePatternWhitespace(忽略空白)忽略表達式中的非轉(zhuǎn)義空白并啟用由#標記的注釋。,ExplicitCapture(顯式捕獲)僅捕獲已被顯式命名的組。,表7.尚未詳細討論的語法'代碼/語法 說明'a報警字符(打印它的效果是電腦嘀一聲),b通常是單詞分界位置,但如果在字符類里使用代表退格't制表符,Tab'r 回車'v豎向制表符'f 換頁符'n 換行
12、符'e Escape'0nn ASCII代碼中八進制代碼為 nn的字符'xnn ASCII代碼中十六進制代碼為 nn的字符'unnnn Unicode代碼中十六進制代碼為nnnn的字符'cN ASCII 控制字符。比如cC代表Ctrl+C'A 字符串開頭(類似人,但不受處理多行選項的影響)'Z字符串結(jié)尾或行尾(不受處理多行選項的影響)'z 字符串結(jié)尾(類似$,但不受處理多行選項的影響)'G當前搜索的開頭'pname Unicode中命名為 name的字符類,例如 pIsGreek'(>exp) 貪婪子
13、表達式'(<x>-<y>exp)平衡組'(im-nsx:exp)在子表達式exp中改變處理選項,(im-nsx)為表達式后面的部分改變處理選項,(exp)yes|no)把exp當作零寬正向先行斷言,如果在這個位置能匹配,使用yes作為此組的表達式;否則使用 no,(exp)yes) 同上,只是使用空表達式作為no,(name)yes|no)如果命名為name的組捕獲到了內(nèi)容,使用 yes作為表達式;否則使用 no,(name)yes) 同上,只是使用空表達式作為no',在VBA中使用正則表達式,可以通過下列途徑實現(xiàn):,創(chuàng)建正則表達式對象:'
14、;前期綁定:在 VBA代碼編輯器中的"Tools"菜單中,選中"References.",然后引用 Microsoft VBScript Regular Expressions類庫,然后直接定義對象:Dim reg As NewRegExp'后期綁定:使用 CreateObject方法定義對象:CreateObject("") 。,前一種方式的優(yōu)點是可以有編輯器的Intellisense 支持'RegExp對象的屬性:,Global -設置或返回一個 Boolean值,該值指明在整個搜索字符串時模式是全部匹配還是只匹配
15、第一個。如果搜索應用于整個字符串,Global屬性的值應該為True ,否則其值為False。默認的設置為True。,Multiline -返回正則表達式是否具有標志m,缺省值為False。如果指定的搜索字符串分布在多行,這個屬性是要設置為True的。,IgnoreCase -設置或返回一個 Boolean值,指明模式搜索是否區(qū)分大小寫。如果搜索是區(qū) 分大小寫的,則IgnoreCase 屬性應該為False ;否則應該設為 True。缺省值為True。,Pattern -設置或返回被搜索的正則表達式模式。被搜索的正則字符串表達式。它包含各種正則表達式字符。'RegExp對象的方法:,E
16、xecute -對指定的字符串執(zhí)行正則表達式搜索。需要傳入要在其上執(zhí)行正則表達式的文本字符串。正則表達式搜索的設計模式是通過RegExp對象的Pattern 來設置的。Execute方法返回一個Matches集合,其中包含了在 string 中找到的每一個匹配的 Match對象。如 果未找到匹配,Execute將返回空的 Matches集合。,Replace -替換在正則表達式查找中找到的文本,Test -對指定的字符串執(zhí)行一個正則表達式搜索,并返回一個Boolean值指示是否找到匹配的模式。屬性對 Test方法沒有影響。如果找到了匹配的模式,Test方法返回True;否則返回False。
17、39;MatchCollection 對象與 Match 對象,匹配到的所有對象放在MatchCollection 集合中,這個集合對象只有兩個只讀屬性:,Count: 匹配到的對象的數(shù)目,Item :集合的又一通用方法,需要傳入Index值獲取指定的元素。,一般,可以使用 For Each語句枚舉集合中的對象。集合中對象的類型是Match。,Match對象有以下幾個只讀的屬性:,FirstIndex -匹配字符串在整個字符串中的位置,值從0開始。Length -匹配字符串的長度Value -匹配的字符串,SubMatches - 集合,匹配字符串中每個分組的值。作為集合類型,有 Count和
18、Item兩個 屬性。 ,正則表達式很強大,是處理文本的首選,不管你信不信,反正我是信了。說了很多, ,最后以一個小例子結(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,正則表達式替換,參數(shù)說明:sStr原字符串,sReplStr,返回參數(shù),返回替換后的值Dim regEX As ObjectSet regEX = CreateObject("") 'RegEx=True,sReplStr As String, sPatrn As String) As String將替換的字符串,sPatrn樣式為建立正則表達式 設置全局可用=sPatrn'設置樣式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,正則表達式搜索'參數(shù)說明:sStr原字符串,Patrn樣式,IC是否區(qū)別大小寫,G是否全局可用 '返回參數(shù),返回的是一個對象,是搜索的數(shù)量n>=0'ExExce(n).FirstIndex搜索白第n個串的位置,'ExExce(n).Value搜索白第n個串的值,n>=0Dim regEX As ObjectSet regEX
21、 = CreateObject("") 'RegEx為建立正則表達式=True'設置全局可用=sPatrn'設置樣式=IC'設置是否區(qū)分大小寫。Set ExExce = (sStr) '執(zhí)行搜索Set regEX = NothingEnd FunctionFunction ExTest(sStr As String, sPatrn As String, IC As Boolean) As Boolean'正則表達式匹配'VBA代碼'參數(shù)說明:sStr原字符串,Patrn樣式,IC是否區(qū)別大小寫'返回參數(shù)
22、,返回一個邏輯值,True為匹配,F(xiàn)alse為不匹配Dim regEX As ObjectSet regEX = CreateObject("") 'RegEx為建立正則表達式=True=sPatrn=IC'ExTest = (sStr)Set regEX = NothingEnd FunctionPublic Sub 去重復()Dim ss, re, rv設置全局可用設置樣式設置是否區(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)'正則表達式(RegExp)對象 ,提供簡單的正則表達式支持功能 '下面的代碼說明了 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 '"建立變量。建立正則表達式。設置模式。設置是否區(qū)分字符大小寫。設置全局可用性。執(zhí)行搜索。遍歷匹配集合。retStr = retStr & & ",." & vbCrLfNextRegExpTest = retStrEnd Function '
25、Global 屬性,設置或返回一個 Boolean值,該值指明在整個搜索字符串時模式是全部匹配還是只匹配第 一個。'=True | False '對象參數(shù)總是RegExp對象。如果搜索應用于整個字符串,Global屬性的值為True ,否則其值為False。默認的設置為 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ī)范表達式。設置模式。設置是否區(qū)分字母的大小寫。設置全程性質(zhì)。執(zhí)行搜索。重復匹配集合retStr = retStr & "Match found at position RetStr=RetStr&&".Match Value is '"RetStr=RetStr&&"'."&vbCRLF NextRegExpTest = retStrE
27、nd Function'IgnoreCase 屬性'設置或返回一個 Boolean值,指明模式搜索是否區(qū)分大小寫。'=True | False 'Object參數(shù)總是一個 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建立變量。建立正則表達式。設置模式。設置不區(qū)分大小寫。設置全局可用性執(zhí)行搜索。重復匹配集合retStr = retStr & "Match found at position RetStr=RetStr&&".Match Value is '"RetStr=RetStr&&"'."&vb
29、CRLFNextRegExpTest = retStrEnd Function'Execute 方法對指定的字符串執(zhí)行正則表達式搜索'(string)參數(shù)'Object'必選項??偸且粋€RegExp對象的名稱。'string'必選項要在其上執(zhí)行正則表達式的文本字符串'說明'正則表達式搜索的設計模式是通過RegExp對象的Pattern 來設置的。'Execute 方法返回一個Matches集合,其中包含了在string中找到的每一個匹配的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 方法替換在正則表達式查找中找到的文本'(
32、string1, string2)'Object,必選項??偸且粋€RegExp對象的名稱。'stringl'必選項stringl是將要進行文本替換的字符串'string2'必選項。string2是替換文本字符串。'說明'被替換的文本的實際模式是通過RegExp對象的Pattern屬性設置的。'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.建立正則表達式。設置模式。設置是否區(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í)行一個正則表達式搜索,并返回一個Boolean值指示是否找到匹配的模式。'(string)'參數(shù)'Object'必選項??偸且粋€RegExp對象的名稱。'string'必選項要執(zhí)行正則表達式搜索的文本字符串
35、'說明'正則表達式搜索的實際模式是通過RegExp對象的Pattern屬性來設置的屬性對 Test方法沒有影響'如果找到了匹配的模式,Test方法返回True;否則返回False。'下面的代碼說明了 Test方法的用法Function RegExpTest5(patrn, strng)Dim regEX, retVal'建立變量。Set regEX = New RegExp'建立正則表達式。=patrn'設置模式。設置是否區(qū)分大小寫。執(zhí)行搜索測試。找到一個或多個匹配。"未找到匹配。"=False retVal = (s
36、trng) If retVal ThenRegExpTest = ElseRegExpTest = End IfEnd Function'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4")'Match對象'提供了對正則表達式匹配的只讀屬性的訪問'說明'Match對象只能通過 RegExp對象的Execute 方法來創(chuàng)建,該方法實際上返回了Match對象的集合。所有的 Match對象屬性都是只讀的。在執(zhí)行正則表達式時,可能產(chǎn)生零個或多個Match對象。每個 Match對象提供了被
37、正則表達式搜索找到的字符串的訪問、字符串的長度,以及找到匹配的索引位置等。'下面的代碼說明了Match對象的用法:Function RegExpTest6(patrn, strng)Dim regEX, match, matches '建立變量。Set regEX = New RegExp '建立正則表達式。=patrn '設置模式。=True '設置是否區(qū)分大小寫。=True '設置全局替換。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 集合'正則表達式Match對象的集合。 ''說明'Matches 集合中包含若干獨立的Match 對象,只能使用 RegExp對象的Execute 方法來創(chuàng)建之。與獨立的Match對象屬性相同,Matches '集合的一個屬性是只讀的。'在執(zhí)行正則表達式時,可能產(chǎn)生零個或多個Match對象。每個 Match對象都提供了與正則表達式匹配的字符串的訪問入口、字符串的長度,以及標識匹配位置的索弓I。,下面的代碼將說明如何使用正則表達式查找獲得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 集合,正則表達式子匹配字符串的集合 ,說明'SubMatches集合包含了單個的子匹配字符串, SubMatches集合的屬性是只讀的。Matches集合,以及如何循環(huán)遍歷集合:創(chuàng)建變量。創(chuàng)建正則表達式。設置模式。設置是否區(qū)分大小寫。設置全程匹配。執(zhí)行搜索。循環(huán)遍歷Matches只能用RegExp對象的Execute 方法創(chuàng)建
42、。'運行一個正則表達式時,當圓括號中捕捉到子表達式時可以有零個或多個子匹配。'SubMatches集合中的每一項是由正則表達式找到并捕獲的的字符串。'下面的代碼演示了如何從一個正則表達式獲得一個SubMatches集合以及如何操作它的專有成員:Sub MatchTest8() inpStr = ""Dim oRe, oMatch, oMatchesSet oRe = New RegExp'查找一個電子郵件地址(不是一個理想的RegExp)="(w+)(w+).(w+)”' 得到Matches集合Set oMatches =
43、(inpStr)' 因為只有一個地址,所以,集合只有一項,就是索引 =0 的那個' 得到Matches集合中的第一項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é)束(方向向上).行標,列坐標(“b”).清除內(nèi)容'arr =單元格區(qū)域("a1:a" & i)' 設置 reg = 創(chuàng)建對象("vbscript . regexp ")' 工作于reg,. 全局=True'. 忽略
48、大小寫=True'. 樣式="人”,結(jié)束工作于,循環(huán)范圍j = 1 到i,單元格區(qū)域(“b" & j) = reg . 替換字符串(arr(j ,1),"")' 下一句' 結(jié)束過程,正則表達式示例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,正則表達式示例 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生成一個正則表達式對象實例設置全局可用,即替換所有符合匹配模式的字符串 匹配模式為非大寫字母將 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ù)點保留數(shù)字和運算符號+-*/a'RegEx為建立正則表達式y(tǒng)s(12) = "A0-9/.+-a*a"'Set regEX = CreateObject("&q
53、uot;)=True '設置全局可用=ys(Ms)' 樣式zldccmx = (rng,"")Set regEX = Nothing End Function'問題:字符串中1個或者連續(xù)多個空格替換成一個Tab鍵'分析:由于字符串中連續(xù)的空格的個數(shù)不太確定,如果我們逐個字符去分析的話, 也是比較麻煩的,但如果用正則去實現(xiàn),則簡單的多。這也是一個典型的適合用正則解決 的問題。,解決方式如下: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,如果找到匹配的字符,就停止搜索(默認值),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 屬性' 返回正則表達式是否具有標志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 屬性'一個字符串,用來定義正則表達式。缺省值為空文本。'5) Execute 方法' 返回一個MatchCollection 對象,該對象包含每個成功匹配的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 方法'返回一個布爾值,該值指示正則表達式是否與字符串成功匹配。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()'提取英文字母并去重復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'把文件中的空白行去掉:假設d盤有一個文本,內(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)產(chǎn)業(yè)鏈安全監(jiān)管方案手冊
- 離婚財產(chǎn)公證協(xié)議書
- 風力發(fā)電場項目投資合同
- 第八單元-第4課時-認識垂直(教學設計)四年級數(shù)學上冊同步高效課堂系列(蘇教版)
- 2025年愛康國賓項目建議書
- 第3課 項目一《校園護綠小能手·校園綠地護養(yǎng)院》(教學設計)-2023-2024學年三年級下冊綜合實踐活動浙教版
- 第15課 現(xiàn)代醫(yī)療衛(wèi)生體系與社會生活 教學設計 -2023-2024學年統(tǒng)編版(2019)高二歷史選擇性必修2 經(jīng)濟與社會生活
- 溫度傳感器信號線施工方案
- 大單元學習 教學設計 2023-2024學年統(tǒng)編版高中語文選擇性必修下冊
- 浙教版2023小學信息技術(shù)六年級下冊《控制的形態(tài)》教學設計及反思
- GB/T 7260.40-2020不間斷電源系統(tǒng)(UPS)第4部分:環(huán)境要求及報告
- GB/T 3199-2007鋁及鋁合金加工產(chǎn)品包裝、標志、運輸、貯存
- 變革型領導問卷TLQ
- 診斷學-緒論-課件
- g4l操作指南教程硬盤克隆linux系統(tǒng)備份恢復帶截圖
- 消化道大出血的鑒別診斷和處理原則課件
- 教師課堂教學技能課件
- 員工調(diào)整薪酬面談表
- 輔警報名登記表
- 外研版英語五年級下冊第一單元全部試題
- 培養(yǎng)小學生課外閱讀興趣課題研究方案
評論
0/150
提交評論