EXCEL VBA 使用正則表示式清洗替換資料
在EXCEL表內遇到有規律性的資料需要提取或者替換時,比如在資料中提取時間,身份證號碼等,EXCEL內自帶的查詢替換就難以實現,我們可以利用VBA適用正則表示式去對資料進行匹配。
什麼是正則表示式?
正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。
下表為正則表示式的元字元和對它們的一個簡短的描述,新手可以百度下看下教程,不建議死記硬背,多做練習後更容易懂。
常用的正則表示式:
匹配手機號碼:1[3|4|5|7|8][0-9]{9}
匹配身份證號(15位):\d{14}[[0-9],0-9xX] ;身份證號(18位):\d{17}(\d|X|x)
匹配郵箱地址:[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
匹配(年-月-日)格式日期:([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))
匹配3位以上數字:[1-9][0-9]{2,}
匹配字串之間的字元:前面的字元(.*?)後面的字元,比如abc123def ,需要匹配abc和def之間的字元的表示式就是abc(.*?)def
在VBA使用正則表示式程式碼如下:
Sub re() Application.ScreenUpdating = False Set oRegExp1 = CreateObject("vbscript.regexp") re = InputBox("請輸入正則表示式") if re="" then exit sub With oRegExp1 .Global = True .IgnoreCase = True .Pattern = re End With For Each Rng In Selection if Rng <>"" then Set a = oRegExp1.Execute(Rng) For j = 0 To a.Count - 1 IF j=0 then b = a(j) else b = b & "," & a(j) end if Next Rng.Value = b b = "" end if Next Application.ScreenUpdating = true End Sub
例如在下面的產品名稱內需要提取TM-xxx這個型號,則正則表示式為:TM-[0-9]{3,} (TM-為開頭字串加上3個數字以上)
選擇需要提取的A列資料,執行VBA,在輸入框內輸入正則表示式,確認後就可以得到結果:
結果如下:
若有多個結果會以,號隔開放回結果。
另:正則表示式線上測試平臺:http://tool.oschina.net/regex/