ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 42114|回复: 82

[分享] 正则表达式学习总结1

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-8-8 15:59 | 显示全部楼层 |阅读模式
1、正则表达式能干什么呢?
    你肯定用过excel的“查找”、“替换”功能。正则表达式也可以对字符串进行特定的复杂查找和替换,但它比“查找”和“替换”功能强大的多的多。
    正在看蓝桥玄霜版主的字典帖,选了其中的两个例子(附件中的例A和例B),你看到的第一反应是用字典去解决,例A和例B使用正则表达式也很好的解决了问题。(给出这两个例子不是说正则表达式比字典好,只是借此体会正则表达式的强大功能)
例1、有如下一组电话号码,如何改变成右侧的样式。
(020)12345678     020-12345678
(021)32145678     021-32145678
(0371)45678129     0371-45678129
(0392)1234567     0392-1234567
(010)21458965     010-21458965
(0393)45987636     0393-45987636
(0372)87654321     0372-87654321

你想到用查找—替换功能解决的方法了吗?利用正则表达式很容易实现。
Private Sub CommandButton1_Click()
Dim regEX As New RegExp‘定义一个正则表达式对象
regEX.Pattern = "\((\d{3,4})\)(\d{7,8})"‘设置正则表达式
For i = 1 To 7
    Range("c" & i) = regEX.Replace(Range("a" & i), "$1-$2")
Next
End Sub
2、什么是正则表达式?
    简单的说,正则表达式就是一个由一组具有特殊含义的字符组成的字符串,(如例中的"\((\d{3,4})\)(\d{7,8})"),这些有特殊含义的字符设置了一些条件,并通过regEX.Pattern = "\((\d{3,4})\)(\d{7,8})"这一句告诉查找引擎,按照它规定的条件查找符合要求的字符串。
再看一个简单的例子:
例2,把字符串“这有一本关于VBA的书,它在第二个书柜里”里的书换为“book”。
Private Sub CommandButton2_Click()
Dim regEX As New RegExp
regEX.Global = True‘设置查找返回全部匹配
regEX.IgnoreCase = FALSE‘设置查找不区分大小写
regEX.Pattern = "书"
Range("a12") = regEX.Replace("这有一本关于VBA的书,它在第二个书柜里", "book")
End Sub
3、正则表达式的工作原理
    我们需要找出目标字符串中所有的“书”字,根据我们的要求写出正则表达式:”书”,通过regEX.Pattern = "书"这句把我们的要求以正则表达式的形式告诉查找引擎(本例中正则表达式规定的条件很简单:符合要求的字符串必须是字符“书”),查找引擎从目标字符串的第一个字符开始查找,找到符合正则表达式要求的字符串后就存储起来,然后继续向后查找直到结束。最后,把找到的所有符合要求的字符串以集合的形式返回。(关于返回的集合后面会详细介绍)
4、正则表达式对象有四个属性:
Global:设置为true表示查找引擎返回找到的所有符合要求的子字符串,设置为false表示只返回找到的第一个符合要求的子字符串。
IgnoreCase:设置为true表示查找时忽略大小写,设置为FALSE表示查找时区分大小写。
Pattern:存放正则表达式,如例2一样regEX.Pattern = "书"
MultiLine:不用多说了吧。
5、正则表达式对象有三个方法:
Execute方法: 语法object. Execute(sourcestring as string) as string, object为你定义的正则表达式对象(如:regEX),参数sourcestring为要对其进行查找的字符串(如例中的"这有一本关于VBA的书,它在第二个书柜里")。Execute方法查找并返回符合要求的字符串的集合,相当于使用“查找”功能。
Test方法:语法object. Execute(sourcestring as string) as string,其结构和用法和Execute方法一样,它和Execute方法唯一不同的是Test方法只进行测试查找,而不会返回符合要求的子字符串集合。一般用它判断是否可以找到符合要求的字符串。
Replace方法:语法object. Replace(sourcestring as string,Replace) as string, object为你定义的正则表达式对象,参数sourcestring为要对其进行查找的字符串, 参数Replacevar为要替换成的内容(如例中的"book")。Replace方法查找并返回符合要求的字符串的集合,然后对集合里的字符串进行替换。相当于先使用“查找”功能然后再使用“替换”功能。
6、使用正则表达式的步骤:
要在VBA中使用正则表达式,首先要“工程”—“引用”里添加对“Microsoft VBScript Regular Expressions 5.5”的引用。(当然,你也可以采用后期绑定的方法)。
第一步:引用 “Microsoft VBScript Regular Expressions 5.5”
第二步:然后根据实际情况设置正则表达式的属性。
1、设置Global属性的值
由于我们要替换所有的“书”字,而不是只替换第一个“书”字,所以设置Global属性为TRUE即regEX.Global = True。
2、设置IgnoreCase属性的值
由于我们要查找替换的是汉字,无所谓大小写,所以设置IgnoreCase属性为FALSE即regEX.IgnoreCase = FALSE。
第三步、把我们要找的字符串必须符合的条件写成则表达式,并赋值给Pattern属性(例中是regEX.Pattern = "书")
第四步:然后根据具体要求选择适当的方法,因为我们不仅要查找符合要求的字符串,而且还要对其进行替换,所以采用Replace方法。(例中是regEX.Replace("这有一本关于VBA的书,它在第二个书柜里", "book")。
看到这,你会发现使用正则表达式很容易,关键是如何根据具体要求写出正确的正则表达式,这是学习的主要内容。

例A、B.rar

58.4 KB, 下载次数: 819

配套例子.rar

59.67 KB, 下载次数: 816

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-8-8 16:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-8-8 21:50 | 显示全部楼层
感觉有时构造一个复杂而实用的表达式比函数和代码都难!

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-9 17:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
对学过的东西进行总结就是最好的复习和巩固,将来生疏了还可以作为资料查询
匹配单个字符
1、全字匹配。
例3、把“中华人民共和国河南升鹤壁市浚县”中的“升”字改为“省”。
分析:我们的要求很简单,就是要找到确定的字“升”。根据我们的要求写出正则表达式,正则表达式规定符合要求的字符串必须满足的要求:1、它是单个字符,2、该字符必须是“升”字。如何把这个条件写成正则表达式呢?
以后一律用“要求”代表“符合要求的字符串必须满足的要求”
解决:所有的单个的大小写字母、数字,以及后面将要讲到的特殊字符,都是一个正则表达式,例如: “i”就是一个正则表达式。它所描述的要求就是:符合要求的子字符串必须就是单个字符“i”。所以:
正则表达式:”升”
替换为:”省”
例4、把“中华人民共和国河南省鹤壁市浚县”中的“华人民共和”字去掉。
分析:我们的需要的是:找到字符串“华人民共和”。要求:1、它由5个字符组成,2、该字符串就是“华人民共和”。
解决:如果需要查找的是一个字符串,只需依次写出这些字符,这些字符组成的字符串也是正则表达式。所以:
正则表达式:”华人民共和”
替换为:””
说明:如果替换的内容为空字符串就相当于把找到的内容删除。
总结:这种正则表达式是最简单的,直接把要查找的字符串作为正则表达式即可。由于这种匹配方式只能匹配与正则表达式完全相同的字符,所以也叫“全字匹配”。
2、匹配任意单个字符
例5、把列表中的所有数据改成正确的“中华人民共和国河南升鹤壁市浚县”。
分析:我们的要求是:无论”中”字后是什么字符,该字符和”中”组成的字符串都是要找的。要求: 1、第一个字符为“中”,2、第二个字符可以为任意字符。第2个条件如何表示呢?
解决:我们可以用”.”表示任何任意的单个字符、英文字母、数字,以及它本身。就是说要查找的字符不确定是什么时,可在该位置用“.”代替,表示该位置可以为任何字符。所以:
正则表达式:”中.”
替换为:”中华”
说明:无论”中”字后是什么字符,该字符和”中”组成的字符串都符合正则表达式”中.”的要求。
例6、把列表中的所有数据改成正确的“中华人民共和国河南升鹤壁市浚县”。
分析:我们的要求是:无论”人民”之前和之后是什么字符,该字符和”人民”组成的字符串都是正确的。要求: 1、第1个字符可以为任意字符,2、第2第3个字符为”人民”,3、第4个可以为任意字符。所以:
正则表达式:” .人民.”
替换为:”华人民共”
说明:“.”可以和其他字符任意组合使用。
例7、把列表中的所有数据改成正确的“中华人民共和国河南升鹤壁市浚县”。
分析:我们的要求是:“中”字后面可以是五个任意的字符。条件:1、共6个字符,2、第1个字符”中”,3、其余五个字符每个都可以为任意字符。所以:
正则表达式:”中…..”
替换为:”中华人民共和”
说明:“.”可以连续使用,每个“.”表示该位置可以为一个任意字符。
3、匹配“.”元字符
例8、把“bookb.xls”改为“bookB.xls”。
分析:我们的要求是找到字符“.”前的“b”,就是说”.”应该只代表它本身而不代表字符“o” 或其他任意字符。要求: 1、第1个字符是”b”,2、第2个字符为”.”。所以:
正则表达式:” b\.”
替换为:”B.”
正则表达式如果写成” b.”,你会得到一个错误结果:“B.okB.xls”,因为正则表达式” b.”中的”.”所描述的条件是:1、第1个字符是”b”,2、第2个字符为任意一个字符,因为字符“o”属于任意一个字符的范畴,所以”bo”也是符合要求的。
说明:有的时候,我们不想让“.”代表任何的字符,仅仅想让它代表“.”这个字符(也就
是它本身),此时,可以使用“\.”来对它进行转义。字符“.”在正则表达式中有双重含义:既可以表示任意字符又可以只代表它本身(后面还会接触到更多此类字符),如果要在正则表达式中让这些字符只代表它本身,需要在它们之前加上“\”。


匹配指定的单个字符
1、匹配字符组
例9、把数字编号1、2和8的戒指的编号删除,其余的不变。
分析:我们需要的字符串是:”戒指1”、”戒指2“ 和”戒指8“,而其他的排除在外。就是说第2个字符的内容不确定,只有第2个字符是指定的几个字符时,它们中的任意一个和“指”组成的字符串都是符合要求的。要求:1、第1个字符为“指”,2、第2个字符可以是1也可以是2,还可以是8,不能是其他字符。正则表达式“指.”显然不对,它让“戒指5”和“戒指8“等也成为符合要求的字符串。
解决:这种情况可以使用字符组。它的语法是 “[dt]”。 “dt”是我们指定的符合要求的字符组合,它的含义是:“[dt]”所在位置的字符是可以变化的,从“d ”或者“t”里任先一个都是符合要求的,但该处不能是任意字符。相当于缩小了范围的“.” 。“[]”本身不参与字符匹配,它仅仅是字符组的标识。“[]”里的字符没有先后顺序之分,可以任意排列。所以:
正则表达式:”指[128]”
替换为:”指”
说明:”指[128]”表示:”指”字后面的字符可以从数字1、2、8中选择一个,但不能同时都选或选择一个以上。你可以改变“[]”里的数字试一下。
例10、把所有的“-“前的名称替换为“首饰”
分析:我们需要的字符串是:“戒指”、“手镯”、“耳环”。要求:1、共两个字符2、这两个字符只能是戒指 或手镯或耳环。写成[戒指手镯耳环]是错误的,因为它表示六个字符中任意一个字都是符合要求的。
解决:可以使用“|”将两个或多个需要的字符串分开,如“string1|string2”,它的意思是:
string1 或者string2 这两个字符串中的任意一个都是符合要求的。所以:
正则表达式:”戒指|手镯|耳环”
替换为:”首饰”
说明: |用于指定可以选择的字符串,[]用于指定可以选择的单个字符。
2、反义字符组
这时候,我们可以使用反义字符组, 就是在字符组最左侧加入“^”。
例11把数字编号不是1、2和8的戒指的编号删除,其余的不变。
分析:我们需要的字符串是:只要不是”戒指1”、”戒指2“ 和”戒指8“,其他的都是要找的。就是说第2个字符的内容不确定,只有第2个字符不是指定的几个字符时,其他任意一个字符和“指”组成的字符串都是符合要求的。要求:1、第1个字符为“指”,2、第2个字符不能是1、 2、8,可以是其他任意一个字符。
解决:有时我们需要匹配“除了某些字符以外”的其他字符,这种情况可以使用反义字符组。其语法是:“[^dt]”。 “dt”是我们指定的不符合要求的字符,它的含义是:“[dt]”所在位置的字符是可以变化的,该位置不能是从“d ”,也不能是“t”,但可以是其他任意一个字符。
说明: [^12]表示“指”后的位置处如果是数字1或数字2,它们和“指”组成的字符串是不符合要求的。
3、在字符组中使用字符 区间
例12、将表中所有数据的字母编号删除。
分析: “指”字和任意一个字母组成的字符串都是我们需要的。要求:1、第1个字符是“指”,2、第2个字符可以是26个字母中的任意一个。你能轻松的写出正则表达式:文档[abcdefghijklmnopqrstuvwxyz],问题是你不觉得很麻烦吗?
解决:这种情况可以用字符区间来简化,它的语法是:“[起始字符-结束字符]”。它相当于在[]里写上从起始字符到结束字符之间的所有字符(包含起始、结束字符)。例如“[0-9]”表示在数字0和9区间内的任意一个数字,相当于[0123456789]。[a-z] 表示在字母a和z区间内的任意一个字母,相当于[0123456789]。所以:
正则表达式:”指[a-E]”
替换为:”指”
说明: 起始字符和结束字符依据的是它们的 ASCⅡ值的大小,另外,如果起始字符的 ASCⅡ值大于结束字符的 ASCⅡ值,例如,如果你写成“[3-0]”,或“[e-a]”则会出错。
4、特殊含义的字符
我们再次遇到了有特殊含义的字符“[”和“]” 和“-”,这些有特殊含义的字符叫元字符,如果要在正则表达式中使用了它们,并且需要它们代表它本身而没有特殊含义,就要用“\”加以转换。
例13数据列表中所有非数字的编号去掉。
分析:我们需要的子字符串是“档”字后是任意一个字母或者是字符“-”。要求:1、第1个字符为“档”,第2个字符可以为“a”、“-”、“c”三个字符中的任何一个。所以:
正则表达式:”档[a\-c]”
替换为:”档”
说明:结果中“文档-.doc”也变为“文档.doc”,因为正则表达式“文档[a\-c]”中的“-”不再起到连字符的作用,而是和“\”一起使用表示它本身(“\-”代表普通字符“-”)。正则表达式“[a\-c]”表示“a”和“-”和“c”三个字符,而不是字符a到字符c区间中的a、b、c三个个字符。把正则表达式换为”档[a-c]”试一下。
总结:要在表达式中使元字符表示它本身,需要写成:“\元字符”。例如、我们要使用“\”本身,在表达式中就要写成“\\”,要使用“[”本身,在表达式中就要写成“\[”。另外,字符“-“只有在“[]”内使用时才是是元字符,在“[]”外可以直接使用,不用加“\”。

与元字符相反,有些普通字符加上“\”后就有了特殊的含义,成为一个元字符。例如:
“\r”表示回车,它可以和字符串中的回车符号匹配
“\n”表示换行,它可以和字符串中的换行符号匹配
“\t”表示制表符(Tab键),它可以和字符串中的制表符号匹配
下面介绍几个常用的元字符:
“\d”表示任意的单个数字,它可以代表任意一个单个数字,与 [0-9] 作用相同
“\D”表示任意的非数字的单个字符,它可以代表任意一个非数字的单个字符,与 [^0-9] 作用相同
“\w”表示所有单个的大小写字母、数字、下划线,与 [a-zA-Z0-9_]作用 相同
“\W”表示所有单个的非大小写字母、非数字、非下划线,与 [^a-zA-Z0-9_]作用 相同
“\s”表示所有单个空字符,与 [\f\n\r\t\v] 作用相同
“\S”表示所有单个非空字符,与 [^\f\n\r\t\v]作用 相同
例14演示“\d”的使用情况,正则表达式换成“\D”试一下
例15演示“\w”的使用情况,正则表达式换成“\W”试一下
例16演示“\s”的使用情况,正则表达式换成“\S”试一下
后面会给出元字符列表。

TA的精华主题

TA的得分主题

发表于 2011-8-9 20:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
与3楼同感~~~

TA的精华主题

TA的得分主题

发表于 2011-8-9 21:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
支持继续~

TA的精华主题

TA的得分主题

发表于 2011-8-31 14:12 | 显示全部楼层
本帖最后由 JLF2003 于 2011-8-31 14:35 编辑

讲得不错,受益了。

TA的精华主题

TA的得分主题

发表于 2011-8-31 14:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-8-31 15:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
想学习了解这方面知识。谢谢楼主。

TA的精华主题

TA的得分主题

发表于 2011-9-1 23:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 23:06 , Processed in 0.044940 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表