VBA之正则表达式(5)
实例需求:数据保存在A列中,需要将其中中文字符提取至B列。如何匹配中文字符呢?
大家都知道匹配英文单词很简单,[a-zA-z]
把26个字母大小写将都涵盖了,可是中文字符怎么搞呢,是否也可以使用类似的方法,找到中文的开始和结尾的字符。中文到底有多少个字符?其实这个问题很难回答。CJK(CJK Unified Ideographs,中日韩统一表意文字)字符集中从0x4E00到0x9FA5 的连续区域,包含了 20902 个来自于中国、韩国、日本的汉字,涵盖了多数中文字符,可以说CJK是GB2312-80和BIG5等字符集的超集。
0x4E00和0x9FA5分别对应中文中的哪个字呢?大家可以在网上使用Unicode转换器进行转换,其实在Word中使用【符号】对话框将可以进行查询,如下图所示。
0x4E00对应汉字【一】,0x9FA5对应汉字【龥】,这个字属于古汉字,其读音为yù,使用拼音输入法,需要翻页N多次,才可以找到它。
在不同字体中,0x9FA5不一定是CJK统一汉字的最后一个字,例如下图还有之后的8个字符也属于CJK统一汉字,但是这些似乎都是偏旁部首,所以一般情况下使用[一-龥]
匹配汉字就足够了。由于输入龥字比较麻烦,直接使用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行代码使用后期绑定创建正则对象。
第7行代码指定正则匹配字符串,用于匹配非中文字符,方括号中的^
代表字符集的否定,即不包含指定字符集。
第8行代码设置为全局搜索模式。
第9行代码第12行代码循环处理工作表中的数据。
第11行代码执行正则替换,并将替换后的结果写入工作表中。
赞 (0)