簡(jiǎn)明Excel VBA(四)正則表達(dá)式(Regular Expression)

簡(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末调塌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惠猿,更是在濱河造成了極大的恐慌羔砾,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶妖,死亡現(xiàn)場(chǎng)離奇詭異姜凄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趾访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門态秧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扼鞋,你說(shuō)我怎么就攤上這事申鱼。” “怎么了藏鹊?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵润讥,是天一觀的道長(zhǎng)转锈。 經(jīng)常有香客問(wèn)我盘寡,道長(zhǎng),這世上最難降的妖魔是什么撮慨? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任竿痰,我火速辦了婚禮,結(jié)果婚禮上砌溺,老公的妹妹穿的比我還像新娘影涉。我一直安慰自己,他們只是感情好规伐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布蟹倾。 她就那樣靜靜地躺著,像睡著了一般猖闪。 火紅的嫁衣襯著肌膚如雪鲜棠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天培慌,我揣著相機(jī)與錄音豁陆,去河邊找鬼。 笑死吵护,一個(gè)胖子當(dāng)著我的面吹牛盒音,可吹牛的內(nèi)容都是我干的表鳍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼祥诽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼譬圣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起雄坪,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胁镐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后诸衔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盯漂,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年笨农,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了就缆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谒亦,死狀恐怖竭宰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情份招,我是刑警寧澤切揭,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站锁摔,受9級(jí)特大地震影響廓旬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谐腰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一孕豹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧十气,春花似錦励背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芹枷,卻和暖如春衅疙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杖狼。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工炼蛤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝶涩。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓理朋,卻偏偏與公主長(zhǎng)得像絮识,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗽上,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容