网站首页 > 技术文章 正文
本文于2023年9月21日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!
内容提要
- 正则表达式提取中文字符
大家好,我是冷水泡茶,今天在EXCELHOME论坛上看到一个求助贴:如何用VBA把连续拼音字符去掉?
下了附件一看,他的数据是这样的:
经过一通分析,这应该是一个输入法的码表,前面是五笔字型编码,后面是词组,但是混合了拼音。
他现在要把拼音去掉,变成右侧五笔字型编码+词组的形式。
到底应该怎么做呢?
如果从他的提问的方向出发,“去掉”拼音,我们得设法“去掉“英文字和“|”符号,似乎不太好下手,因为前面也有拼音;如果要判断连续的英文字母是汉语拼音,好象也没有什么好办法。
其实,我们换一个角度来考虑,他“要保留什么”,问题就好解决了。即保留前面几位字母和后面的汉字,当然也并非如此简单。
我们可以采用正则表达式提取中文字符,再从前面截取几位字母,应该能达成楼主的需求,分享给大家:
基本思路:
1、把B:C列原始数据读入数组arr()。
2、循环数组,利用正则表达式提取第1列中的中文字符。
3、从数组第1列字符中截取第一个空格前的字符(原本是截取5位,4个字母+1个空格,后来发现编码有3位的)。
4、把第3、第2条所得的字符拼接起来。
5、把拼接的字符写入数组的第2列。
6、把数组回写到工作表。
VBA代码
1、在模块1里,process过程:
Sub process()
On Error Resume Next
Dim ws As Worksheet
Dim lastRow As Integer
Dim arr(), str1 As String, str2 As String
Dim regex As Object
Dim matches As Object
Set ws = ThisWorkbook.Sheets("Sheet1")
Set regex = CreateObject("VBScript.RegExp")
regex.Global = True
regex.IgnoreCase = True
regex.Pattern = "[\u4e00-\u9fa5\d]+"
With ws
lastRow = .UsedRange.Rows.Count
.Range("C2:C" & lastRow).ClearContents
arr = ws.Range(Cells(2, 2), Cells(lastRow, 3)).Value
For i = 1 To UBound(arr)
str1 = arr(i, 1)
Set matches = regex.Execute(str1)
For j = 0 To matches.Count - 1
str2 = str2 & matches(j) & " "
Next
str2 = Left(str2, Len(str2) - 1) '去掉尾部多余空格
arr(i, 2) = Left(str1, InStr(str1, " ")) & str2
str2 = ""
Next
.Range("B2").Resize(UBound(arr), 2) = arr
End With
End Sub
代码解析:
(1)Line2,容错语句,防止正则表达式匹配不到内容报错。
(2)Line3~7,定义变量,数组、工作表对象、字典对象、正则表达式对象等。
(3)line12,正则表达式的模式(pattern),匹配任意数量的中文与数字。这里原来仅仅匹配中文的,但在测试中发现,个别文本中还带有数字。
(4)line16,把原始数据装入数组arr()。
(5)line17~26,循环数组,逐个处理第一列字符,把结果存到第二列。
(A)line18,把第一列字符赋值给str1,方便后面引用。
(B)line19,进行正则表达式的匹配。
(C)line20~25,对匹配结果进行处理,把多个匹配结果连接起来,中间空一格,去掉尾部多余的空格,赋值给str2;把第一列字符第一个空格及前面的字符截取出来,并与str2相连接,存到数组第二列。
(6)line27,把数组结果回写到工作表。
2、在工作表Sheet1里,命令按钮:
Private Sub CmdProcess_Click()
Call process
End Sub
Private Sub CmdClear_Click()
With Sheets("Sheet1")
.Range("C2:C" & .UsedRange.Rows.Count).ClearContents
End With
End Sub
代码解析:
(1)Line1~3,调用process处理过程。
(2)Line5~9,清除C列生成的内容,这主要是为了演示的需要,在process过程中也有清除内容的语句。
动画演示
总结
1、用正则表达式处理字符串,非常方便。
2、我们考虑问题的时候,如果正面处理没法下手,可以试试换一个角度看问题。
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留言评论、分享一下呗!感谢支持!
- 上一篇: 小心别落入正则回溯陷阱(正则表达式回溯陷阱)
- 下一篇: 正则表达式 量词(正则表达式子表达式)
猜你喜欢
- 2025-03-20 正则表达式学习之替换分组练习(正则匹配并替换)
- 2025-03-20 「正则表达式」 一、正则表达式字符匹配(前端必懂 )
- 2025-03-20 人人都看得懂的正则表达式教程(正则表达式 详解)
- 2025-03-20 这几种正则表达式的“字符集合”,想要入门regexp函数,必须了解
- 2025-03-20 这几个冷门到你没听过的App,好用到为你打开新世界大门
- 2025-03-20 java正则-取出指定字符串之间的内容
- 2025-03-20 正则表达式 量词(正则表达式子表达式)
- 2025-03-20 小心别落入正则回溯陷阱(正则表达式回溯陷阱)
- 2025-03-20 测试文章,为评论转发而生(测试评论功能)
- 2025-03-20 别再把shell中命令行的glob当做正则了
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)