如何正则匹配乱码?
曾经护网的时候,遇到过要写一个正则,匹配文本中包含乱码,当时精神状态比较紧张,没有写出来,事后感觉非常尴尬,不过现在已经释然了,趁着周末休息的时候,简单研究了一下,以防未来还会遇到同样的问题,测试样例如下,包含:中文、英文、韩文、日文、中文标点符号、英文标点符号,以及乱码。
ailx10
网络安全优秀回答者
网络安全硕士
去咨询
正则表达式[ -~]+,可以匹配所有的可打印的ASCII码字符,但是不能匹配中文、中文标点符号以及乱码。
正则表达式[^ -~]+,可以匹配所有中文、中文标点符号以及乱码,也能匹配日文、韩文。
正则表达式[\\u4e00-\\u9fa5]+,可以匹配所有的中文。
正则表达式[\\u3002\\uff1f\\uff01\\uff0c\\u3001\\uff1b\\uff1a\\u201c\\u201d\\u2018\\u2019\\uff08\\uff09\\u300a\\u300b\\u3008\\u3009\\u3010\\u3011\\u300e\\u300f\\u300c\\u300d\\ufe43\\ufe44\\u3014\\u3015\\u2026\\u2014\\uff5e\\ufe4f\\uffe5\\u00a5]+,可以匹配所有的中文标点符号。
正则表达式[\\u2E80-\\u2FDF\\u3040-\\u318F\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FFF\\uA960-\\uA97F\\uAC00-\\uD7FF]+ ,可以匹配所有的中日韩文,但是不包含标点符号。
所以,初略的构建一个匹配乱码的正则表达式如下:
[^ -~\\u2E80-\\u2FDF\\u3040-\\u318F\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FFF\\uA960-\\uA97F\\uAC00-\\uD7FF\\u3002\\u00a5\\uff1f\\uff01\\uff0c\\u3001\\uff1b\\uff1a\\u201c\\u201d\\u2018\\u2019\\uff08\\uff09\\u300a\\u300b\\u3008\\u3009\\u3010\\u3011\\u300e\\u300f\\u300c\\u300d\\ufe43\\ufe44\\u3014\\u3015\\u2026\\u2014\\uff5e\\ufe4f\\uffe5\\u00a5]+
测试如下,效果良好:
如果想要匹配乱码之后的所有文本,可以使用如下正则表达式:
如果想要匹配包含乱码的整个文本,可以使用如下正则表达式:
如果文本中不存在乱码,则测试不通过
网络安全任重道远,
发布于 2022-08-06 20:17
Excel VBA【案例】正则表达式提取中文字符/五笔字型编码文本整理
本文于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过程:
代码解析:
(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里,命令按钮:
代码解析:
(1)Line1~3,调用process处理过程。
(2)Line5~9,清除C列生成的内容,这主要是为了演示的需要,在process过程中也有清除内容的语句。
动画演示
总结
1、用正则表达式处理字符串,非常方便。
2、我们考虑问题的时候,如果正面处理没法下手,可以试试换一个角度看问题。
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留言评论、分享一下呗!感谢支持!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。