EXCEL VBA 正則表達式


 
數據驗證常常出現的狀況是,須要驗證和處理大量的文本內容,有時候須要查找字符串,有時候要按條件替換,而且這些待處理的問題仍是有必定的規律可循的,可是沒法經過枚舉的方式挨個驗證,這個時候就須要正則表達式來幫忙。

1.正則表達式(Regular Expression)基礎
  正則表達式是通用的文本搜索和處理方案,它的知識不是VBA獨有的,基本上每種語言都內置了正則表達式的功能。正則表達式的基礎知識不是這裏的重點,須要的朋友能夠Google一下,或者參看下面的一些入門教程:
http://deerchao.net/tutorials/regex/regex.htm
http://www.regexlab.com/zh/regref.htm
http://www.williamlong.info/archives/433.html
html

2.VBA中的正則表達式應用
  在VBA中使用正則表達式,能夠經過下列途徑實現:
建立正則表達式對象:
前期綁定:在VBA代碼編輯器中的"Tools"菜單中,選中"References...",而後引用Microsoft VBScript Regular Expressions 5.5類庫,而後直接定義對象:Dim reg As New RegExp。
後期綁定:使用CreateObject方法定義對象:CreateObject("VBSCRIPT.REGEXP")。
前一種方式的優勢是能夠有編輯器的Intellisense支持。
正則表達式

RegExp對象的屬性:
Global
 - 設置或返回一個 Boolean 值,該值指明在整個搜索字符串時模式是所有匹配仍是隻匹配第一個。若是搜索應用於整個字符串,Global 屬性的值應該爲 True,不然其值爲 False。默認的設置爲True。
Multiline - 返回正則表達式是否具備標誌m, 缺省值爲False。若是指定的搜索字符串分佈在多行,這個屬性是要設置爲True的。
IgnoreCase - 設置或返回一個Boolean值,指明模式搜索是否區分大小寫。若是搜索是區分大小寫的,則 IgnoreCase 屬性應該爲False;不然應該設爲True。缺省值爲True。
Pattern - 設置或返回被搜索的正則表達式模式。 被搜索的正則字符串表達式。它包含各類正則表達式字符。
設計模式

RegExp對象的方法:
Execute
 - 對指定的字符串執行正則表達式搜索。須要傳入要在其上執行正則表達式的文本字符串。正則表達式搜索的設計模式是經過 RegExp對象的Pattern來設置的。Execute方法返回一個Matches集合,其中包含了在string中找到的每個匹配的Match對 象。若是未找到匹配,Execute將返回空的Matches集合。
Replace - 替換在正則表達式查找中找到的文本。
Test - 對指定的字符串執行一個正則表達式搜索,並返回一個 Boolean 值指示是否找到匹配的模式。RegExp.Global屬性對Test方法沒有影響。若是找到了匹配的模式,Test方法返回True;不然返回False。
數組

MatchCollection對象與Match對象
匹配到的全部對象放在MatchCollection集合中,這個集合對象只有兩個只讀屬性:
Count:匹配到的對象的數目
Item:集合的又一通用方法,須要傳入Index值獲取指定的元素。
編輯器

通常,可使用For Each語句枚舉集合中的對象。集合中對象的類型是Match。
Match對象有如下幾個只讀的屬性:
FirstIndex - 匹配字符串在整個字符串中的位置,值從0開始。
Length - 匹配字符串的長度。
Value - 匹配的字符串。
SubMatches - 集合,匹配字符串中每一個分組的值。做爲集合類型,有Count和Item兩個屬性。
工具

結尾兩個示例:
' 正則表達式示例1 提取字符串中的數字
Sub getNum1()
    ' 這種使用方式須要"工具""引用"
    ' 引用Microsoft VBScript Regular Expressions 5.5類庫
    Dim reg As New RegExp
    With reg
        .Global = True
        .IgnoreCase = True
        .Pattern = "\d+"
    End With
    
   Dim mc As MatchCollection
   Dim m As Match
   Set mc = reg.Execute("123aaaaa987uiiui999")
   For Each m In mc
    MsgBox m.Value + 1
   Next
End Sub
' 正則表達式示例2 用"字符串"替換原字符串中符合匹配模式的部分
Sub getNum2()
    Dim arr
    arr = Split("A12B-R1E2W-E1T-R2T-Q1B2Y3U4D", "-") ' split(字符串,"分隔符")拆分字符串
    MsgBox "arr(0)=" & arr(0) & ";arr(1)=" & arr(1)
    MsgBox Join(arr, ",") ' join(數組,"分隔符")用分隔鏈接數組的每一個元成一個字符串
    
    Dim arrStr() As String
    ReDim arrStr(LBound(arr) To UBound(arr)) ' 爲動態數組分配存儲空間
    With CreateObject("VBSCRIPT.REGEXP") ' 生成一個正則表達式對象實例
        For i = LBound(arr) To UBound(arr)
            .Global = True ' 設置全局可用,即替換全部符合匹配模式的字符串
            .Pattern = "[^A-Z]" ' 匹配模式爲非大寫字母
            arrStr(i) = .Replace(arr(i), "") ' 將arr(i)字符串中符合匹配模式的部分替換爲空字符
        Next
    End With
    Cells.ClearContents
    Cells(1, 1).Resize(UBound(arr) + 1, 1) = Application.WorksheetFunction.Transpose(arrStr())
End Sub


他那代碼沒看,本身用到寫了下
Java代碼   收藏代碼
  1. '<body>タグに onLoad="commonOnload()"があるか。  
  2. Private Function SubCheckBodyCommonOnload(pageStr)  
  3.          Dim reg As Object  
  4.          Set reg = CreateObject("VBscript.RegExp")  
  5.             With reg  
  6.                 .Global = True  
  7.                 .IgnoreCase = True  
  8.                 .Pattern = "(<)([\s]*)(body)([\w\W]*)(onLoad)([\s]*)=([\s]*)(\W)([\s]*)(commonOnload\()([\s]*)(\))"  
  9.             End With  
  10.               
  11.         SubCheckBodyCommonOnload = reg.test(pageStr)  
  12. End Function 
相關文章
相關標籤/搜索