ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

一起学学正则表达式(长)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-3-20 23:00 | 显示全部楼层 |阅读模式
1 虽然正则表达式在VBA里作用不是很大,但是当你在处理文本搜索等时觉得?和*功能有限,正则表达式就是个不错的选择。正则表达式是基于文本的编辑器和搜索工具的一个重要部分,在数据有效性验证,替换文本,提取子字符串有很好的应用。(部分参考VBScript文档) 2 在一些脚本语言里(如VBScript,JScript,PHP,Perl)我们可以直接使用正则表达式,但在VBA里没有正则表达式(RegExp)对象。要在VBA里使用正则表达式的话,我们需要在引用里增加Microsoft VBScript Regular Expression 5.5动态库。下面是个简单的应用例子:
  1. Dim regEx as RegExp
  2. Dim aMatch as Match
  3. Dim Matches as MatchCollection
  4. Dim patrn as String
  5. Dim strng as String
  6. Dim RetStr as String
  7. patrn="is."
  8. strng="IS1 is2 IS3 is4"
  9. Set regEx=new RegExp
  10. regEx.Pattern=patrn
  11. regEx.IgnoreCase=True
  12. regEx.Global=True
  13. set Matches=regEx.Execute(strng)
  14. For Each aMatch in Matches
  15. RetStr=RetStr & "Match found at position "
  16. RetStr=RetStr & aMatch.FirstIndex & ". Match Value is '"
  17. RetStr=RetStr & aMatch.Value & "'." & vbCrLf
  18. Next
  19. MsgBox RetStr
复制代码
3 属性 Global 设置或返回一个Boolean值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。缺省为False。 IgnoreCase 设置或返回一个Boolean值,指明模式是否区分大小写。缺省为False。 Pattern 设置或返回被搜索的正则表达式模式。 4 方法 Test 对指定的字符串执行一个正则表达式搜索,并返回一个Boolean值指示是否找到匹配的模式。 用法:Object.Test(String) Execute 对指定的字符串执行正则表达式搜索。 用法:Object.Execute(String) Replace 替换在正则表达式查找中找到的文本。 用法:Object.Replace(String1,String2) string1是将要进行文本替换的字符串,String2是替换文本字符串。 先到这里,明天再说说关键的地方,怎样写正则表达式。 [ 本帖最后由 taller 于 2009-8-31 11:12 编辑 ]

TA的精华主题

TA的得分主题

发表于 2006-3-21 00:06 | 显示全部楼层
期待中......

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-23 21:23 | 显示全部楼层

5 Pattern 参考Learning PHP5(by David Sklar)和VBScript文档

\ 将下一个字符标记为特殊字符或字面值。例如“n”与字符“n”匹配。“\n“与换行符匹配。序列”\\“与"\"匹配。"\("与"("匹配。

. 匹配换行符以外的任何字符。

x|y 匹配x或y。例如"z|food"匹配"z"或"food"。 "(z|f)oo"匹配"zoo"或"food".

Quantifiers(数量词)

* 匹配前一个字符零次或几次

+ 匹配前一个字符一次或多次

? 匹配前一个字符零次或一次

{n} n为非负的整数。匹配恰好n次

{n,} n为非负的整数。匹配至少n次

{n,m} n,m为非负的整数。匹配至少n次,至多m次

举些例子:

ba+ 意思是b,然后至少一个a 匹配ba,baa,baaa,rhumba,babar 不匹配b,abs,taaadaaa,celeste。

ba+na*s 意思是b,至少一个a,n,0个或多个a,s 匹配turbans,baanas,rhumbanas 不匹配banana, bananas。

ba(na){2} 意思是ba,然后两次na 匹配banana,bananas,semi-banana,bananarama 不匹配cabana,banarama。

ba{2,}ba{3,} 意思是b,然后至少两次a,然后b,然后至少三次a 匹配baabaaa,baaaabaaaaa,rhumbaabaaas 不匹配baabaa,babaaar,banana

(baa-){2,4}baa 意思是至少两次,最多四次baa-,然后baa 匹配baa-baa-baa,baa-baa-baa-baa-baa,comp-pa-pa-baa-baa-baa-oomp-pa-pa 不匹配baa-baa,baa-baad-news

dogs? and cats( and chickens?)? 意思是dog,然后一个可选s,然后 and cat, 然后一个可选s, 然后一个可选and chicken或and chickens 匹配dog and cat and chicken,dog and cat and chickens, hotdogs and cats, dogs and cat and chickens, dog and cats and chicken, dog and cat and chickensoup 不匹配doggies and cats,dogs and cats or chickens, dogss and catss, dog and cat and chieckenlegs

Anchors(锚)

^ 匹配输入的开始位置

$ 匹配输入的结尾

\b 与单词的边界匹配,即单词与空格之间的位置。例如,"er\b"与"never"中的"er"匹配,但是不匹配"verb"中的"er"。

\B 与非单词边界匹配。"ea*r\B"与"never early"中的"ear"匹配。

例子:

^Gre 匹配Green, Grey Lantern和Grep is my favorite 不匹配GGreen VVegetables, gre或InGres。

!$ 匹配"Zip!,""Zoom!,"和"Pow! Kablam!," 不匹配"Kerfloofie.," "! is the negation operator," "Pow! oh.,"或"!!!!?."

^ba(na)+ 匹配banana和bananarama 不匹配cabana

ba(na)_+$ 匹配banana和cabana 不匹配bananarama

^ba(na)+$ 仅匹配banana和bananana...

^(w|W|b|B)illy?$ 匹配will,Will,Bill,bill,Willy,willy,Billy和billy 不匹配Willa,billo,twill,handbill或William。

\b[fF]ish 匹配fish,go fish!,sport-fishing和Hamilton Fish High School 不匹配bluefish,sportfishing或swordfish。

Character Classes字符集

[xyz] 一个字符集,与括号中字符的其中之一匹配。例如,"[abc]"匹配"plain"中的"a"。

[^xyz] 一个否定的字符集,匹配不在此括号中的任何字符。例如,"[^abc]"匹配"plain"中的"p"。

[a-z] 表示某个范围内的字符。与指定区间内的任何字符匹配。

[^m-z] 否定的字符区间。与不在指定区间内的任何字符匹配。

\d 与一个数字字符匹配。等同[0-9]。

\D 与非数字字符匹配。等同[^0-9]。

\s 与任何空白字符匹配,包括空格,制表符,分页符等。等同"[ \f\n\r\t\v]"。

\s 与任何非空白字符匹配。等同"[^ \f\n\r\t\v]"。

\w 与任何单词字符匹配,包括下划线。等同"[A-Za-z0-9_]"。

\w 与任何非单词字符匹配。等同"[^A-Za-z0-9_]"。

\f 与分页符匹配

\n 与换行符匹配

\r 与回车符匹配

\t 与制表符匹配

VBA例子:

Sub ChangeEmail()

Dim regEx as RegExp

Set regEx = New RegExp

dim patrn as String

Dim strng as String

patrn="([^@\s]+)@(([-a-z0-9]+\.)+[a-z]{2,})"

strng="Inky T. Ghost inky@pacman.example.com" & vbCrLf & "Donkey K. gorilla kong@banana.example.com"

regEx.Patten=patrn

regEx.IgnoreCase=True

regEx.Global=True

MsgBox regEx.Replace(strng,"$1 at $2")

End Sub

patrn = "^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*?[a-z]+$" 这个判断是不是Email地址。

patrn = "^^http?:\/\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+"这个判断是不是HTTP地址。

唉,写了这么多,其实我自己也不太会用。下次说说反向引用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-23 21:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

排版一团糟!

[em04]

TA的精华主题

TA的得分主题

发表于 2006-12-18 07:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

学习中,谢谢!!!!

TA的精华主题

TA的得分主题

发表于 2006-12-22 18:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习学习。谢谢楼主。[em10][em10]

TA的精华主题

TA的得分主题

发表于 2006-12-22 20:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TA的精华主题

TA的得分主题

发表于 2006-12-22 20:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

....

重發

[em06]
[此贴子已经被作者于2006-12-22 21:01:25编辑过]

TA的精华主题

TA的得分主题

发表于 2006-12-22 21:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-4-21 17:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习学习学习学习
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 14:32 , Processed in 0.044996 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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