EXCEL正则表达式之元字符
上一节中我们讲过了正则表达式的基础语法,举了一个例子,把A列数据各个部门中的门字去掉,当时写的代码中:
Set regx = CreateObject(\”vbscript.regexp\”)
With regx
.Global = True
.Pattern = \”门\”
End With
.Pattern = \”门\”,此表达式中的“门”字就是一个普通字符,如果表达式中只是用普通字符的话,那我们用查找功能完全可以匹配目标字符串,为何还要写代码呢?所以正则表达式中还有另外一种字符,叫做元字符。
比如我们在查找时通常会用通配符“*”表示任意字符,在正则表达式中也有一些固定的字符,他们可以表达某一类型的字符,以实现强大的匹配能力。
下面例举一些常用的元字符:(注意大小写之分)
\\d 匹配一个数字字符
\\D 匹配一个非数字字符
\\w 匹配包括下划线的任何单词字符。[A-Za-z0-9_]
\\W 匹配任何非单词字符
\\s 匹配任何空白字符,包括空格、制表符、换页符等等
\\S 匹配任何非空白字符
\\b 匹配一个单词边界,也就是指单词和空格间的位置
\\B 匹配非单词边界
\\n 匹配一个换行符
\\r 匹配一个回车符
\\t 匹配一个制表符
. 匹配除\”\\n\”之外的任何单个字符。
我们通过具体的例子来体会下这些元字符的作用。
案例1:提取字符串
上图中A列数据把产品和单价写在一起了,有的是单价在产品前面,有的是单价在产品的后面,现在想把他们分开到两列。
用函数也可以做 但挺麻烦的。如果用正则表达式,只要把每个单元格中的数字匹配出来,然后替换成空就得到了汉字部分了,反之只要把汉字匹配出来替换为空就得到了数字。
前面我们讲过,在元字符中,\\d 匹配一个数字字符,我们看下关键代码:
Sub 提取汉字()
Dim regx As Object, n%
Set regx = CreateObject(\”vbscript.regexp\”)
With regx
.Global = True
.Pattern = \”\\d\” \’匹配数字
End With
Do
n = n + 1
Cells(n + 1, 2).Value = regx.Replace(Cells(n + 1, 1).Value, \”\”)
Loop Until Cells(n + 1, 1).Value = \”\”
End Sub
同理,\\D 匹配一个非数字字符,我们可以通过“\\D”来匹配汉字,把汉字替换成空,得到数字。代码如下:
Sub 提取数字()
Dim regx As Object, n%
Set regx = CreateObject(\”vbscript.regexp\”)
With regx
.Global = True
.Pattern = \”\\D\”
End With
Do
n = n + 1
Cells(n + 1, 3).Value = regx.Replace(Cells(n + 1, 1).Value, \”\”)
Loop Until Cells(n + 1, 1).Value = \”\”
End Sub
两段代码的运行结果如下:
如果是字母和汉字放在一个单元格里,我们可以用\\W 匹配任何非单词字符,这样就能匹配出字母,替换为空即可得到汉字部分。
案例2:规范格式
\\s 匹配任何空白字符,包括空格、制表符、换页符等等,我们把换行符和空格匹配出来并且全部替换为“-”即可。
代码如下:
Sub 规范格式()
Dim regx As Object, n%
Set regx = CreateObject(\”vbscript.regexp\”)
With regx
.Global = True
.Pattern = \”\\s\”
End With
Do
n = n + 1
Cells(n + 1, 2).Value = regx.Replace(Cells(n + 1, 1).Value, \”-\”)
Loop Until Cells(n + 1, 1).Value = \”\”
End Sub
通过这节课,我们了解了什么是元字符,并且初步体会到了正则表达式的强大之处,后面我们逐步地讲解更加复杂的匹配。
转自:米宏Office
学习VBA,报表做到飞 第四章 正则表达式 4.2 正则表达式元字符和量词
第四章 正则表达式
4.2 正则表达式的元字符和量词
正则表达式的代码编写非常简单,而且近乎格式化模式,千篇一律。其功能强大的原因主要在于通过它的元字符和量词的组合,从一堆杂乱无章的字符中找出符合规则的字符串来。元字符和量词就是正则表达式用来描述要找的字符串的特征的。
4.2.1 元字符
\\d 匹配一个数字
\\D 匹配一个非数字字符(包括字母、汉字、空格、下划线、各类符号)
\\w 匹配单个字母、汉字、数字和_。
\\W 匹配任何非单词字符(包括空格、各类符号,不包括下划线)
\\s 匹配任何空白字符(包括空格、制表符、换行符等,也就是眼睛看不到的字符)
\\S 匹配任何非空白字符(也就是眼睛能看到的字符)
\\n 匹配一个换行符
\\r 匹配一个回车符
\\t 匹配一个制表符(Tab键)
\\b 匹配一个单词边界,也就是指单词和空格间的位置(不支持汉字)
\\B 匹配非单词边界(跟\\b相反)
. 匹配除“\\n”之外的任何单个字符
*** 在VBA里,.是一个元字符,\\.表示其本身,也就是说,要想表示.,就必须在它前面加上\\,否则系统会把它当作一个元字符来对待。
[一-龢]或[\\u4e00-\\u9fa5] 匹配汉字
4.2.2 元字符量词
*:匹配零次或多次
+:匹配一次或多次
?:匹配零次或一次
上下限:{下限,上限}
{n} 匹配n次
{n,} 匹配至少n次,无上限
{n,y} 匹配n次到y次,y>n
4.2.3 连接符
|表示or,如“工程|结算”,表示匹配“工程”或者“结算”均可。如果有多个或者条件,在语句执行时,会按照顺序先匹配前面的条件,再匹配后面的条件。
[]表示匹配中括号中的任意一个字符。
如:[abc],表示匹配字母abc中的任意一个均可
[a-zA-Z],表示匹配任意一个大小写字母均可
[0-6],表示匹配0到6的任意一个数字
4.2.4 用正则表达式测试工具查看匹配结果
我们通过元字符和量词的组合来描述要找的字符串的特征,然后用这个组合去文本中查找,查找到的内容就是匹配结果。下面我们通过一些例子来说明元字符和量词的应用,通过正则表达式测试工具来匹配。
4.2.4.1
在“买牛肉3斤,115元”里匹配数字:
表达式:\\d+,匹配一个或多个数字
匹配结果:
匹配到两个结果:3、115
如果想匹配带小数点的数字,如“买牛肉3斤,115.56元”,表达式可以修改为:\\d+\\.?\\d*,小数点匹配0次或1次,小数点后面的数字匹配0次或多次。
4.2.4.2
在55,76,1000,357,2500,12380中匹配4位数字:\\d{4},有三个匹配结果:1000,2500,1238
匹配所有大于等于1000的数字:\\d{4,},有三个匹配结果:1000,2500,12380
关于\\d{4}表达式想匹配4位数,却匹配到12380里的1238,造成匹配结果不准确的情况,我们会在以后的章节里解决。
4.2.4.3
在下面一段话里匹配“工程”或者“结算”:
施工过程结算是指工程项目实施过程中,发承包双方依据施工合同,对约定结算周期内已完工程价款进行结算的活动,其结算文件经发承包双方签署认可后,作为工程竣工结算文件的组成部分。
表达式:工程|结算
匹配结果:
匹配到8个结果。
4.2.5 常用的正则表达式
1、数字:[0-9]*
2、n位的数字:\\d{n}
3、至少n位的数字:\\d{n,}
4、x-y位的数字:\\d{x,y}
5、带1-2位小数的数字:\\d+(\\.\\d{1,2})?
8、非负整数:^\\d+$
9、汉字:[一-龢]+
10、英文和数字:[A-Za-z0-9]+
11、由英文字母组成的字符串:[A-Za-z]+
12、由大写英文字母组成的字符串:[A-Z]+
13、由小写英文字母组成的字符串:[a-z]+
14、由汉字、数字、字母或者下划线组成的字符串:\\w+
15、汉字、数字、字母组成的字符串:[一-龢A-Za-z0-9]+
16、身份证号(15位、18位数字):\\d{15}|\\d{18}
17、密码(以字母开头,长度在6~8之间,只能包含字母、数字和下划线):^[a-zA-Z][a-zA-Z0-9_]{5,7}$
18、日期格式:\\d{4}-\\d{1,2}-\\d{1,2}
往期精彩回顾:
我是云飞扬,职场财会人员,愿与大家分享表格制作和数据统计分析的技巧与方法,希望大家的工作更便捷,更轻松!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。