示例:数据保存在A列中,需要将其中的中文字符提取至B列。
CJK(CJK Unified Ideographs,中日韩统一表意文字)字符集中了从0x4E00
到0x9FA5
的连续区域,包含了 20902 个来自于中国、韩国、日本的汉字,涵盖了多数中文字符,可以说CJK是GB2312-80和BIG5等字符集的超集。
0x4E00和0x9FA5分别对应中文中的哪个字呢?在Word中使用【符号】对话框将可以进行查询,如下图所示。
(1)0x4E00
(2)0x9FA5
0x4E00对应汉字【一】,0x9FA5对应汉字【龥】,这个字属于古汉字,其读音为yù
。
在不同的字体(Font)中,0x9FA5不一定是CJK统一汉字的最后一个字。但是,一般情况下使用[一-龥]
匹配汉字就足够了。由于输入龥字比较麻烦,直接使用16进制的字符编码[\u4e00-\u9fa5]
来表示中文字符集更加方便。
回到正文开头,采用的VBA代码如下:
Option Explicit
Sub RegExpChinese()
'提取中文内容
Dim objRegEx As Object
Dim obj As Range, strTxt As String
Set objRegEx = CreateObject("vbscript.regexp")
'objRegEx.Pattern = "[^一-龥]"
objRegEx.Pattern = "[^\u4e00-\u9fa5]"
objRegEx.Global = True
For Each obj In Range([A1], Cells(Rows.Count, 1).End(xlUp))
strTxt = Trim(obj.Value2)
obj.Offset(0, 1).Value2 = objRegEx.Replace(strTxt, "")
Next
Set objRegEx = Nothing
MsgBox "Done!"
End Sub
(1)[^\u4e00-\u9fa5]
,用于匹配非中文字符,方括号中的^
代表字符集的否定,即不包含指定的字符集。
延伸阅读:
(1)超集
如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S1就是S2的一个超集,反过来说,S2是S1的子集。
参考资料:
[1] VBA之正则表达式(5)-- 中文字符(https://blog.csdn.net/taller_2000/article/details/88374471)
[2] 超集(https://baike.baidu.com/item/%E8%B6%85%E9%9B%86/1059571)
[3] 正则表达式之匹配中文(https://www.w3cschool.cn/regexp/nck51pqj.html)