VBA正则表达式入门与提高 下载本文

正则表达式入门与提高

中的所有匹配,那么需要把它的属性值设置为True。

IgnoreCase 设置对英文字母大小写是否敏感。默认值False, 对大小写敏感;设置为True,忽略大小写. MultiLine 它影响且只影响元字符^和$的意义。值为False,无论目标文本是多少行,整个文本中则只有一个开始位置,^表示第一行的开始;只有一个行结束位置,$表示文本末尾位置。值为True,那么,^和$分别表示每一行的行首和行尾位置。

下面来完成一个简单的任务,再具体认识各属性的使用方法: 有一两行的文本: Aaa Bbb 任务要求:

1.在文本开始和结束处,分别插入一个”@”符号; 2.在文本每行的开始和行尾分别插入”@”符号。 正则表达式:

^|$ 表示匹配行开始或结束位置 任务1代码: Sub test1() Dim reg, s$

s = \这里用vblf 表示行之间的换行符 Set reg = CreateObject(\ reg.Pattern = \ reg.Global = True s = reg.Replace(s, \ MsgBox s End Sub 讨论:

Msgbox 最后显示的结果为: @Aaa Bbb@

代码中修改了global的默认属性值,设置为true;目的是保证能找到并替换全部的开始或结束位置。如果保持默认属性,则只会在开始处插入一个@号。

正则对象Reg的其它两个属性保持为默认。因为本任务无关乎字母大小问题,所以IgnoreCase属性

11

VBA平台的正则学习参考资料

无需要设置为Ture(当然如果设置为true,对最后结果也无影响);由于Mutiline属性保持默认,其值为False,所以整个文本只有一个开始位置和一个结束位置。

代码中使用了对象reg的replace方法,它的作用是,将在目标文本中找到的匹配(开始和结束位置)替换为”@”字符,在这里实际上是插入。然后把修改后的文本返回,重新赋值给字符变量S。

任务2代码: Sub test2() Dim reg, s$

s = \

Set reg = CreateObject(\ reg.Pattern = \ reg.Global = True reg.MultiLine = True s = reg.Replace(s, \ MsgBox s End Sub 讨论:

任务2代码与任务1代码唯一区别是修改了mutiline默认属性,设置为True。这就意为着,该文本的每一行都存在一个开始位置和结束位置。所以Msgbox最后显示的结果为:

@Aaa@ @Baa@

6.应用对象的方法代码段

VBScirpt正则对象的方法共有三个:你可以根据任务要求选择使用一个或多个方法. (1)TEST方法

语法:Object.Test(string)

Test方法只是简单测试目标文本中,是否包含正则表达式所描述的字符串。如果存在,则返回True,否则返回False。

例:用代码检测用户的输入是否是一个电子邮箱。 Sub ChkEmail()

12

正则表达式入门与提高

Dim reg, s$

s = InputBox(\请输入一个电子邮箱:\ Set reg = CreateObject(\ reg.Pattern = \ If reg.Test(s) Then

MsgBox \你输入的电子邮箱格式正确: \ Else

MsgBox \你输入的电子邮箱格式不正确!\ End If End Sub 讨论:

代码从用户那里获得字符串,然后赋值与字符变量S。验证邮箱的正则表达式非常简略,元字符序列\表示不是空格的任意一个字符,后面紧跟一个+号表示一个以上字符。这个表达式事实上只验证了用户的输入里,在字符串之间是否有一个@符号。它甚至认为”0@中”都是正确的。下面给出一个更为严格的电子邮箱正则表达式:“^[\\w.-]+@[\\w.-]+$”当然要严格按电子邮箱规范写出正则表达式,可能就十分复杂,由于我们刚刚接触正则,就不在详细讨论了。

这里要关注的是,test方法的语法,在方法与正则对象之间也是用英文点号隔开,作为参数,目标字符串用英文括号包围。在这个例子中,如果Test返回的是true,表示目标文本S中找到了正则模式的匹配。则显示正确结果,否则显示错误提示。

(2)Replace方法

替换在目标文本中用正则表达式查找到的字符串。 前面例子中语句体现其语法:s=reg.replace(s,”@”)

后面括号中的参数S,代表前面代码中设置的目标文本字符串.也就是正则表达式将要作用的目标文本.”@”是用来替换的字符串参数.前面的s是Replace方法返回的结果,它是目标文本被替换后的一个副本. 如果没有找到匹配的文本,将返回与目标文本一样的一个副本.

下面继续讨论Replace方法的第二个参数:

例子中\是一个字面字符,要用一对双引号包围起来。第二个参数还可以是变量、表达式。如果是变量或函数则不能用双引号包围,这一点和VBA代码规则是一致的.

上一章我们知道了如果在正则表达式中使用了元字符序列()括号,那么被圆括号包围的内容会存储在

13

VBA平台的正则学习参考资料

特殊变量$1中。在有些编程语言中,可以直接在正则代码外使用$1变量,而VBScript中可以并只可以在Replace方法中,作为第二参数来调用。

例子:在目标文本中的数字数据后增加上单位:KG

目标文本:“他们体重分别是:张三56,李四49,王五60。”

结果文本要求: “他们体重分别是:张三56KG,李四49KG,王五60KG。” 正则表达式:(\\d+) 替换文本: $1KG Sub testrep() Dim reg, s$

s = \他们体重分别是:张三56,李四49,王五60。\ Set reg = CreateObject(\ reg.Pattern = \ reg.Global = True s = reg.Replace(s, \ MsgBox s End Sub 讨论:

用正则表达式(\\d+),Replace方法将在目标文本中找到三个匹配,其值分别是56,49,60。并分别把每个值保存于每一个匹配对象的$1变量中。

替换文本:”$1KG”表示每一个匹配中的$1变量值与字面字符”KG”联结,组成新字符串,用来替换找到的数据字符串。

$1是一个很特殊的变量,它由美元符号与数字编号组成.如果正则表达式中有两个或两个以上的捕获性括号,则按照左括号”(“从左到右顺序编号,自动命名为$1,$2,$3?.,共支持99组.要指出的是,如果找到多个匹配,那么每个匹配中的特殊变量名是一样的.这个例中共有三个匹配其值分别为56,49,60.第一个匹配的变量名是$1,第二和第三个匹配的变量名仍然是$1,只是每个匹配中$1保存的值是不一样的.

最后一点,作为替换参数的一部分,$1变量与字面字符共同组成替换字符串时,它们之间不用 & 符号连接,并且 $1 必须放在一个双引号中;而如果是用其它普通变量与字面字符联结组成替换文本时,则必须用 & 符号联接,这一点与VBA代码使用方法相同.

在Replace方法的第二个参数中,还有几个很少用到的特殊变量:

14