VBA之正则表达式(5)-- 中文字符

论坛 期权论坛 期权     
VBA编程学习与实践   2019-7-27 14:39   6178   0
实例需求:数据保存在A列中,需要将其中中文字符提取至B列。如何匹配中文字符呢?



大家都知道匹配英文单词很简单,[a-zA-z]把26个字母大小写将都涵盖了,可是中文字符怎么搞呢,是否也可以使用类似的方法,找到中文的开始和结尾的字符。中文到底有多少个字符?其实这个问题很难回答。CJK(CJK Unified Ideographs,中日韩统一表意文字)字符集中从0x4E00到0x9FA5 的连续区域,包含了 20902 个来自于中国、韩国、日本的汉字,涵盖了多数中文字符,可以说CJK是GB2312-80和BIG5等字符集的超集。
0x4E00和0x9FA5分别对应中文中的哪个字呢?大家可以在网上使用Unicode转换器进行转换,其实在Word中使用【符号】对话框将可以进行查询,如下图所示。





0x4E00d对应汉字【一】,0x9FA5对应汉字【龥】,这个字属于古汉字,其读音为yù,使用拼音输入法,需要翻页N多次,才可以找到它。


在不同字体中,0x9FA5不一定是CJK统一汉字的最后一个字,例如下图还有之后的8个字符也属于CJK统一汉字,但是这些似乎都是偏旁部首,所以一般情况下使用[一-龥]匹配汉字就足够了。由于输入龥字比较麻烦,直接使用16进制的字符编码[\u4e00-\u9fa5]来表示中文字符集更加方便。


示例代码如下。
  1. Sub RegExpChinese()
复制代码
  1.     Dim strTxt As String, strMsg As String
复制代码
  1.     Dim objRegEx As Object, objMatch As Object
复制代码
  1.     Dim j As Integer
复制代码
  1.     Set objRegEx = CreateObject("vbscript.regexp")
复制代码
  1.     'objRegEx.Pattern = "[^一-龥]"
复制代码
  1.     objRegEx.Pattern = "[^\u4e00-\u9fa5]"
复制代码
  1.     objRegEx.Global = True
复制代码
  1.     For Each c In Range([A1], Cells(Rows.Count, 1).End(xlUp))
复制代码
  1.         strTxt = Trim(c.Value)
复制代码
  1.         c.Offset(0, 1).Value = objRegEx.Replace(strTxt, "")
复制代码
  1.     Next
复制代码
  1.     Set objRegEx = Nothing
复制代码
  1. End Sub
复制代码
【代码解析】
第6行代码使用后期绑定创建正则对象。
第7行代码指定正则匹配字符串,用于匹配非中文字符,方括号中的^代表字符集的否定,即不包含指定字符集。
第8行代码设置为全局搜索模式。
第9行代码第12行代码循环处理工作表中的数据。
第11行代码执行正则替换,并将替换后的结果写入工作表中。

作者:taller
微软全球最有价值专家
ExcelHome技术论坛VBA版块版主
EH论坛VBA系列图书主创人

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:220
帖子:44
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP