vba正则表达式入门

vba正则表达式入门正则表达式很强大且内容比较多。不少初学者学这个表示很困难。故写一篇入门的教程。1、什么是正则表达式正则表达式是一个天才创建的用于快速检索匹配字符串,通过简单的表达式匹配文本。2、正则表达式的组成正则表达式也是一个字符串,包括元字符、限定符和正常意义的字符。正则表达式强大的地方就在元字符和限定符。3、限定符很多人讲这个都是先讲元字符。其实先讲限定符更加容易吸收。限定符是表示前面字符或元字符出现的次数。主要限定符如下:限定符 含义 * 表示前面字符或…

大家好,欢迎来到IT知识分享网。vba正则表达式入门"

正则表达式很强大且内容比较多。不少初学者学这个表示很困难。故写一篇入门的教程。

1、什么是正则表达式

正则表达式是一个天才创建的用于快速检索匹配字符串,通过简单的表达式匹配文本。

2、正则表达式的组成

正则表达式也是一个字符串,包括元字符、限定符和正常意义的字符。正则表达式强大的地方就在元字符和限定符。

3、限定符

很多人讲这个都是先讲元字符。其实先讲限定符更加容易吸收。限定符是表示前面字符或元字符出现的次数。主要限定符如下:

限定符 含义
* 表示前面字符或元字符出现0次或多次。例如:zo*m,可以匹配zm,zom,zoom
+ 表示前面字符或元字符出现1次或多次。例如:zo+m,可以匹配zom,zoom
表示前面字符或元字符出现0次或1次。例如:zo?m,可以匹配zm,zom
{n} 表示前面字符或元字符出现n次。例如:zo{3}m,可以匹配zooom
{n,m} 表示前面字符或元字符出现n到m次。例如:zo{1,3}m,可以匹配zom,zoom,zooom
{n,} 表示前面字符或元字符至少出现n次。例如:zo{2,}m,可以匹配zoom,zooom等等

当然,限定符用法不止这些。正则表达式还有个规则叫贪婪与吝啬。有些人也叫贪婪与懒惰。这个“贪婪与吝啬”是正则表达式难点和重点之一。

例如,字符串“n123n456n789n”。那么我们怎么匹配获取“n123n”和“n123n456n789n”呢。

使用正则表达式,首先要找规律。很明显我们要获取的内容开头和结尾都有一个字母n,中间是数字或字母。我们先学一个元字符。元字符是可以代表一定含义或规律的字符。可以匹配除了换行符之外的任意字符是小数点。

那么我们的表达式可以这么写:n.+n

两个字母n,中间夹着1个或多个任意字符。

但这样只能匹配得到一个结果:n123n456n789n。在我们没有对其任何限制的情况下,正则表达式会尽可能多匹配符合条件的结果。从头到尾整个都符合,所以都匹配了。这个称之为贪婪匹配。

那如何做到尽可能少的匹配。这个就需要加个?进行限制。

例如,表达式:n.+?n

这个表达式尽可能少匹配,也就是说碰到一次符合条件的就立马返回结果。结果可以匹配到“n123n”、“n789n”。

这种规则叫做吝啬匹配。只要在限定符后面再加个问号即可。

    

4、元字符

元字符是用于匹配字符串,可以代表一定含义或规律的字符串。主要的元字符如下:

元字符 含义
. 小数点,代表除了换行符以外的任意字符
\ 转义,若我想匹配一些被正则表达式占用的字符,例如小数点,可以用\.
[abc] 匹配中括号内的字符,例如[a-zA-Z],可以匹配到大小写字母
[^abc] 不匹配中括号内的字符,例如[^a-z],表示不匹配小写字母
\w 可以匹配字母、下划线和数字,相当于[a-zA-Z0-9_]
\W 大写的W是小写的w相反情况,也就是不匹配字母、下划线和数字。相当于[^a-zA-Z0-9_]
\s 匹配任意空白符,相当于[\f\n\r\t\v]
\S 匹配任意非空符,相当于[^\f\n\r\t\v]或[^\s]
\d 匹配数字,相当于[0-9]
\D 匹配非数字,相当于[^0-9]
\b 匹配单词的边界。这个匹配英文单词特别有用。例如\b[\w’]+?\b就可以匹配任意单词了
\f 匹配换页符
\n 匹配换行符
\r 匹配回车符
\t 匹配tab制表符
\v 匹配垂直制表符
^ 不在中括号内的^,表示从字符串的开头开始匹配
$ 表示匹配到字符串的结尾
x|y 匹配x或y
(表达式) 元组,用小括号括起来的表达式当作一个元组,可以当作一个整体,也可以被\1\2\3这样类似索引获取。

元字符比较多,这里就建议大家先收藏,需要用的时候再查阅。多用几次就自然记住了。

这里还有个小技巧,若我想匹配全部任意字符,包括换行符。可以用一组相反的元字符,例如[\s\S],就可以匹配全部任意字符。

   

5、常见的正则表达式

说了这么多,晕了没?看一些实例:

1)匹配邮编,邮编是6位数字。正则表达式:\d{6}

2)匹配手机,手机号是11位数字。正则表达式:\d{11}

3)匹配电话,电话是区号-号码组成,区号有3到4位,号码有6到9位。正则表达式:\d{3,4}-\d{6,9}

4)匹配日期,日期格式如1992-5-30,明显数字加横线组成。正则表达式:\d{4}-\d{1,2}-\d{1,2}

5)匹配汉字,汉字需要通过编码转义,汉字都unicode编码中都在一个范围内。正则表达式:[\u4e00-\u9fa5]

6、vba中使用正则表达式

若只是上面这些内容,那么还是纸上谈兵,需要应用到实际中。看看如何在vba中使用正则表达式。

vba使用正则表达式需要用到一个RegExp对象。

该对象可以通过引用Microsoft VBScript Regular Expressions 5.5。再声明定义:

 
  1. Dim reg As New RegExp

还可以直接用CreateObject方法创建:

 
  1. Dim reg As Object
  2. set reg = CreateObject(“VBScript.Regexp”)

创建RegExp对象之后,看看它的相关属性和方法。

属性:

1)Global,是否全局匹配,若为False,匹配到一个结果之后,就不再匹配。默认False,建议设为True;

2)IgnoreCase,是否忽略大小写,默认False,建议设为False,这个会影响到正常表达式匹配;

3)Multiline,是否跨行匹配,默认False,建议设为False,这个会影响到正常表达式匹配;

4)Pattern,获取或设置正则表达式。

方法:

1)Execute,执行匹配

2)Replace,根据正确表达式全部替换

3)Test,测试正则表达式能否匹配到内容

    

举一些典型的例子:

1)判断是否存在数字

 
  1. Public Function CheckNumber(str As String) As Boolean
  2.     Dim reg As Object
  3.     Set reg = CreateObject(“VBScript.Regexp”)
  4.             
  5.     Dim is_exist As Boolean    
  6.     With reg
  7.         .Global = True
  8.         .Pattern = “\d”        
  9.         is_exist = .Test(str)    
  10.     End With
  11.     CheckNumber = is_exist
  12. End Function

用Test方法,判断能否匹配到数字。

2)获取所有编号

 
  1. Public Sub GetCode()
  2.     Dim reg As Object
  3.     Set reg = CreateObject(“VBScript.Regexp”)
  4.     
  5.     Dim str As String
  6.     str = “编号:ABC123155 日期:2016-01-11” & _
  7.           “编号:ABD134215 日期:2016-02-21” & _
  8.           “编号:CBC134216 日期:2016-01-15”
  9.     
  10.     reg.Global = True    reg.Pattern = “[A-Z]{3}\d+”        ‘获取匹配结果’
  11.     Dim matches As Object, match As Object
  12.     Set matches = reg.Execute(str)
  13.     
  14.     ‘遍历所有匹配到的结果’
  15.     For Each match In matches
  16.         ‘测试输出到立即窗口’
  17.         Debug.Print match
  18.     Next
  19. End Sub

因为这个编号是3个大写字母和多个数字组成。可以利用代码中的表达式匹配到3个结果:ABC123155、ABD134215和CBC134216。

3)去掉字符串中的数字

 
  1. Public Function ClearNumber(str As String) As String
  2.     Dim reg As Object    
  3.     Set reg = CreateObject(“VBScript.Regexp”)        
  4.     
  5.     reg.Global = True    
  6.     reg.Pattern = “\d”   
  7.     
  8.     ‘把所有数字替换成空’    
  9.     ClearNumber = reg.Replace(str, “”)
  10. End Function

执行ClearNumber函数,即可去掉数字。例如ClearNumber(“你342好234啊”),可得到”你好啊”。

4)获取子字符串

例如想获取某些字符串中的部分数据,可以匹配完成之后,再用字符串函数处理。但其实不用,用元组可以一次性搞定。

 
  1. Public Sub GetHref()    
  2.     Dim reg As Object    
  3.     Set reg = CreateObject(“VBScript.Regexp”)        
  4.     
  5.     Dim str As String    
  6.     str = “<a href=’xxx1′>xxx1</a><a href=’xxx2′>xxx2</a>”        
  7.     
  8.     reg.Global = True    
  9.     ‘获取a标签中href的属性值’    
  10.     reg.Pattern = “href='(.+?)'”        
  11.     
  12.     ‘获取匹配结果’    
  13.     Dim matches As Object, match As Object    
  14.     Set matches = reg.Execute(str)        
  15.     
  16.     ‘遍历所有匹配到的结果’    
  17.     For Each match In matches        
  18.         ‘测试输出子表达式到立即窗口’        
  19.         Debug.Print match.SubMatches(0)
  20.     Next
  21. End Sub

这里,可以通过match的SubMatches集合获取元组里面的内容。轻松得到xxx1和xxx2。

7、其他说明

vba的正则表达式不是很完整,没有递归的功能。递归是可以匹配公式或html代码等。有兴趣可以了解一下。

最近用到正则,故整理总结一下正则表达式中的一些需要转义的特殊字符,以备日后查询。

特别字符

说明

$

匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或
‘\r’。要匹配 $ 字符本身,请使用
\$。

( )

标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。

*

匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。

+

匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。

.

匹配除换行符 \n之外的任何单字符。要匹配.,请使用\.

[ ]

标记一个中括号表达式的开始。要匹配 [,请使用 \[。

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 字符,请使用 \ 。

\

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’
匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(‘ 则匹配 “(”。

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。

{ }

标记限定符表达式的开始。要匹配 {,请使用 \{。

|

指明两项之间的一个选择。要匹配 |,请使用 \|。

PS:经过后面使用发现/也需要转义,转义为

//

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21018.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信