實例需求:數(shù)據(jù)保存在A列中,需要將其中中文字符提取至B列。如何匹配中文字符呢?
大家都知道匹配英文單詞很簡單,[a-zA-z] 把26個字母大小寫將都涵蓋了,可是中文字符怎么搞呢,是否也可以使用類似的方法,找到中文的開始和結(jié)尾的字符。中文到底有多少個字符?其實這個問題很難回答。CJK(CJK Unified Ideographs,中日韓統(tǒng)一表意文字)字符集中從0x4E00到0x9FA5 的連續(xù)區(qū)域,包含了 20902 個來自于中國、韓國、日本的漢字,涵蓋了多數(shù)中文字符,可以說CJK是GB2312-80和BIG5等字符集的超集。 0x4E00和0x9FA5分別對應(yīng)中文中的哪個字呢?大家可以在網(wǎng)上使用Unicode轉(zhuǎn)換器進行轉(zhuǎn)換,其實在Word中使用【符號】對話框?qū)⒖梢赃M行查詢,如下圖所示。 0x4E00d對應(yīng)漢字【一】,0x9FA5對應(yīng)漢字【龥】,這個字屬于古漢字,其讀音為yù,使用拼音輸入法,需要翻頁N多次,才可以找到它。
在不同字體中,0x9FA5不一定是CJK統(tǒng)一漢字的最后一個字,例如下圖還有之后的8個字符也屬于CJK統(tǒng)一漢字,但是這些似乎都是偏旁部首,所以一般情況下使用[一-龥] 匹配漢字就足夠了。由于輸入龥字比較麻煩,直接使用16進制的字符編碼[\u4e00-\u9fa5] 來表示中文字符集更加方便。
示例代碼如下。 Sub RegExpChinese()
Dim strTxt As String, strMsg As String
Dim objRegEx As Object, objMatch As Object
Dim j As Integer
Set objRegEx = CreateObject("vbscript.regexp")
'objRegEx.Pattern = "[^一-龥]"
objRegEx.Pattern = "[^\u4e00-\u9fa5]"
objRegEx.Global = True
For Each c In Range([A1], Cells(Rows.Count, 1).End(xlUp))
strTxt = Trim(c.Value)
c.Offset(0, 1).Value = objRegEx.Replace(strTxt, "")
Next
Set objRegEx = Nothing
End Sub
【代碼解析】 第6行代碼使用后期綁定創(chuàng)建正則對象。 第7行代碼指定正則匹配字符串,用于匹配非中文字符,方括號中的^ 代表字符集的否定,即不包含指定字符集。 第8行代碼設(shè)置為全局搜索模式。 第9行代碼第12行代碼循環(huán)處理工作表中的數(shù)據(jù)。 第11行代碼執(zhí)行正則替換,并將替換后的結(jié)果寫入工作表中。
相關(guān)博文鏈接: VBA之正則表達式(1)-- 基礎(chǔ)篇 VBA之正則表達式(2)-- 批量修改公式 VBA之正則表達式(3)-- 特殊公式計算 VBA之正則表達式(4)-- 提取日期和金額 VBA之正則表達式(5)-- 中文字符 VBA之正則表達式(6)-- 設(shè)置音標(biāo)格式 VBA之正則表達式(7)-- 乾坤大挪移(數(shù)據(jù)整理) VBA之正則表達式(8)-- 重復(fù)字符分組 VBA之正則表達式(9)-- 添加千分位(1/3) VBA之正則表達式(10)-- 添加千分位(2/3) VBA之正則表達式(11)-- 添加千分位(3/3)
|