ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-9-2 00:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 cumulonimbus 于 2011-9-2 00:32 编辑

"\((\d{3,4})\)(\d{7,8})"‘这里的 \d{3,4}),\d{7,8})表示的是什么意思?\d{2}又是啥意思?凡是以d打头的,我都没看懂,能否解释一下哈!谢谢

TA的精华主题

TA的得分主题

发表于 2011-9-2 09:24 | 显示全部楼层
正则表达式我是一点都看不懂。

TA的精华主题

TA的得分主题

发表于 2011-9-2 09:44 | 显示全部楼层
灵活运用分组+replace方法,就差不多可以解决些基础问题了。当然前提是基本的保留字一定要知道。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-9-2 13:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
匹配多个字符
单个字符(比如“j”)、单个任意字符(即“.”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)等前面学习的内容都只能代表单个字符,如果需要匹配的是多个字符该如何表示呢?
1、一个或多个字符
例17把数据列表中的文件名全部替换为文件.doc。
分析:无论“文”或“存”后是一个“档”字,还是连续的几个“档” 字,它们组成的字符串都是符合要求的字符串。要求:1、第1字符是“文”或“存”,2、第1个字符后可以是一个“档”字,也可以是重复的多个“档”字。
解决:我们可以在单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”)后面加上“+”,来表示”+”前面的字符可以是一个,也可以是重复的多个。例如”a+”可以代表“a”或者”aa”或者”aaa” 或者”aaaa”……,即”a+” 可以代表单个“a”,也可以代表无数个“a”,所以:
正则表达式:” [文存]档+”
替换为:”文件”
说明:前两个数据没有更改,因为“文”或“存”后没有“档”字,而”+”要求它前面的字符至少出现一次。
例18 把数据列表中的文件名改为大写BOOK.xls。演示“+”和字符组联合使用的情况。
“[12]+”代表数字1或数字2,也可以代表由数字1、2组成的任意长度的字符串。把代码中的正则表达式改为” book[12]“看看。
例19 把数据列表中的文件名改为大写BOOK.xls。演示“+”和元字符”\d”联合使用的情况。“\d+”代表任意一个数字,也可以代表由任意数字组成的任意长度的字符串。把代码中的正则表达式改为”book\d“看看。
2、匹配零个或多个字符
例20、把数据列表中的文件名全部替换为文件.doc。
分析:无论 “文”或“存”后没有“档”字,或者是一个“档”字,或者是连续的几个“档” 字,它们组成的字符串都是符合要求的字符串。要求:1、第1字符是“文”或“存”,2、第1个字符后可以没有“档”字,也可以是一个“档”字,也可以是重复的多个“档”字。
解决:我们可以在单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”)后面加上“*”,来表示”*”前面的字符可以没有,也可以是一个,也可以是重复的多个。例如”a*”可以代表 ”” (即什么也没有)或者”a”或者”aa”或者”aaa” 或者”aaaa”……,即”a*” 可以代表单个“a”,也可以代表无数个“a”,也可以表示””( 即什么也没有)。所以:
正则表达式:” [文存]档*”
替换为:”文件”
说明:前两个数据也更改了,因为”*”允许它前面的字符一次也不出现,而“文”或“存”后没有“档”字,是符合要求的。”*”除了允许它前面的字符出现一次或者出现多次,还允许它前面的字符一次也不出现,可以看出”*”实际是把”+”的要求进一步放宽了。
3、匹配零个或一个字符 串
例21把数据列表中的文件名全部替换为文件.doc。
分析:无论 “文”或“存”后没有“档”字,或者是一个“档”字,它们组成的字符串都是符合要求的字符串。要求:1、第1字符是“文”或“存”,2、第1个字符后可以没有“档”字,也可以是一个“档”字。
解决:我们可以在单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”)后面加上“?”,来表示”?”前面的字符可以没有,也可以是一个。例如”a?”可以代表 ”” (即什么也没有)或者”a”,即”a?” 能代表一个“a”,也可以表示””( 即什么也没有),但不能代表连续的几个“a” 字。所以:
正则表达式:” [文存]档?”
替换为:”文件”
说明:前四个数据都更改了,因为“文”或“存”后没有“档”字,都是符合”档?”要求的。
后三个出现了意想不到的结果,因为这三个文件名中,“文”或“存”后有一个以上“档”字,违反了”档?”允许”?”前的字符最多出现一次的条件。出现这样的结果还牵扯到贪婪匹配和惰性匹配的问题,后面再说。
4、匹配指定数目字符
尽管“?”、“+”、“*”可以解上面的问题,但是,它们并不完善:1.没有办法限制最多重复多少个字符,比如说,我们要匹配手机号码,那么应该是 11 个数字,而“+”和“*”会匹配尽可能多的数字,不管是 17 个还是 18 个都认为是正确的。2.没有办法指定最少匹配多少个字符,“+”、“*”、“?”,所能提供的最少字符,要么零个,要么一个。
例22、暂且不考虑区号,把数据列表中正确的手机号替换为”正确“
分析:电话号码为8位,就是说“-”后是8位数字的才是正确的。要求:1、第1个字符是“-”,2、“-”后是8位由任意数字组成的字符串
解决:正则表达式中,可以在 单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”) 后面加“{数字}”,来表示指定个数的字符组成的字符串。例如:
”a {5}”代表5个“a”组成的字符串“aaaaa”,”\d{3}”代表由数字0、1、2、3、4、5、6、7、8、9组成的任意三位数。所以:
正则表达式:\-\d{8}
替换为:“正确”
注意:正则表达式中的”-“没有用在[]里,所以它是普通字符,可以直接使用,代表它本身。加上”\”也不错。
说明:例子使用”test”方法,就像前面说的,”test”方法只验证是否找到符合要求的字符串,如果找到的字符串符合正则表达式的要求它就返回“true”,否则返回“false”。
例23、暂且不考虑区号,把数据列表中正确的手机号替换为”正确“
分析:电话号码为8位或7位都是正确的,就是说“-”后是8位数字或7位数字,即“-”后的数字字符串最短是7位,最长是8位。要求:1、第1个字符是“-”,2、“-”后是最长8位,最短7位由任意数字组成的字符串。
解决:正则表达式中,可以在 单个字符(比如“j”)、字符组(比如“[abcde]”)、特定字符类型(比如“\d”)、单个任意字符(即“.”) 后面加“{最小数目,最大数目}”,来限制其前的字符可以最少是几个和最多有几个。例如:”a {3,5}”代表 “aaa”,或者 “aaaa”或者“aaaaa”,而“aa”和“aaaaaa”都是不符合要求的,因为它们由2个和6个“a”组成,超出了”{3,5}”允许的范围(3到5各之间)。”\d{2,3}”代表由数字0、1、2、3、4、5、6、7、8、9组成的任意的两位数或三位数。所以:
正则表达式:-\d{7,8}
替换为:“正确”
例24、考虑区号,把数据列表中正确的手机号替换为”正确“
分析:区号为3位或4位数字,电话号码为8位或7位都是正确的,要求:1、字符“-”前是最长4位,最短3位由任意数字组成的字符串,2、“-”后是最长8位,最短7位由任意数字组成的字符串。所以:
正则表达式:”\d{3,4}-\d{7,8}”
替换为:“正确”
说明:最小数目可以是 0,所以 “{0,1}”,相当于 “?”。如果将最大数目设为空,如“\d{1,}”相当于“+”;而“{0,}”相当于“*”。
练习:找一组手机号,混入一些错误的号码,写正则表达式从中找出正确的手机号。
分析:手机号第1位必须是1,第2位可以为3或5,后面是任意9位数字。按分析的要求,我们的正则表达式应该规定以下的条件:1、第1位必须是1,2、第2位可以为3或5,3、后面必须是9位数字,这些数字可以是任意的。

TA的精华主题

TA的得分主题

发表于 2011-9-2 14:28 | 显示全部楼层
本帖最后由 wanghaiqn1957 于 2011-9-2 14:28 编辑

最好的办法是:在解决实际问题中得到提高

TA的精华主题

TA的得分主题

发表于 2011-9-2 20:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 cumulonimbus 于 2011-9-2 20:00 编辑

For i = 2 To 8
    Range("e" & i) = regEX.Replace(Range("d" & i), "$1-$2")
Next
还是不明白,后面的"$1-$2",是啥意思,期待老师的精彩讲解!

TA的精华主题

TA的得分主题

发表于 2011-9-2 20:30 | 显示全部楼层
顶起,这个老师讲得很精彩,学习了。如能互动那就更好了。

TA的精华主题

TA的得分主题

发表于 2011-9-2 20:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太高深了,有点晕

TA的精华主题

TA的得分主题

发表于 2011-9-2 21:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
正则表达式,好难学{:soso_e100:}

TA的精华主题

TA的得分主题

发表于 2011-9-2 23:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢楼主的详细讲解{:soso_e181:}
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 18:02 , Processed in 0.038234 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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