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

163 篇文章 16 订阅
51 篇文章 18 订阅

实例需求:数据保存在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行代码执行正则替换,并将替换后的结果写入工作表中。


相关博文链接:
VBA之正则表达式(1)-- 基础篇
VBA之正则表达式(2)-- 批量修改公式
VBA之正则表达式(3)-- 特殊公式计算
VBA之正则表达式(4)-- 提取日期和金额
VBA之正则表达式(5)-- 中文字符
VBA之正则表达式(6)-- 设置音标格式
VBA之正则表达式(7)-- 乾坤大挪移(数据整理)
VBA之正则表达式(8)-- 重复字符分组
VBA之正则表达式(9)-- 添加千分位(1/3)
VBA之正则表达式(10)-- 添加千分位(2/3)
VBA之正则表达式(11)-- 添加千分位(3/3)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值