接上篇…
E、重复指示符
正则表达式的另外一个强大的功能是重复匹配的能力。前述的任何一种“原子”之后,都可以指定一个重复指示符。下面列出各种重复指示符:
? 表示前一“原子”可有可无(重复0或1次)。例如 “我们?”匹配“我”或“我们”;
+ 表示前一“原子”至少匹配一次。例如“\d+”匹 配任何一个无符号整数;
* 表示前一“前子”重复匹配0或多次。例如“\h\w*” 表示许多高级语言对“变量”的定义:以字母或下划 线开头,后接任意多个字母数字或下划线;
{n} 表示前一“原子”重复匹配n次。例如“\c啦{3}” 匹配“哗啦啦啦”或“呼啦啦啦”等;
{n,m} 表示前一“原子”重复匹配n至m次,其中n<=m。如果 n>m,将自动交换m与n的值;
{n,} 至少重复匹配n次,相当于{n,无穷大};
{,m} 至多重复匹配m次,相当于{0,m};
{} 重复任意多次,相当于*。
在前面所述的各种重复指示符中,如果重复的次数不定,将匹配尽可能长的目标串(但最多不超过32767次,这是内设的上限)。例如有一字符串“你好,我好,大家好”,表达式“你.*好”将匹配整个字符串,而不是“你好”或“你好,我好”。如果需要匹配尽可能短的目标串,可以采用前述的最后四种形式,并在“{”之后加上“-”号。上例中的表达式如改为“你.{-}好”,则匹配串为“你好”。
{-n,m} 重复匹配m至n次,匹配次数尽可能少;
{-n,} 至少重复匹配n次,匹配次数尽可能少;
{-,m} 至多重复匹配m次,匹配次数尽可能少,相当于{-0,m};
{-} 重复任意多次,类似于*,但匹配次数尽可能少。
重复指示符只对紧邻在其前的“原子”起作用,例如“你好+”将匹配“你好”,“你好好”……。但是不会匹配“你好你好”。如果要重复匹配一组原子,可以使用括号(子表达式),如“(你好)+”就会匹配“你好你好”。
需要指出的是,重复指示符与引用子表达式具有不同的含义。重复指示符是重复“匹配”,至于匹配的内容则可以不同;而引用子表达式则是重复匹配的内容。例如,“\d{2}”可以匹配任何一个两位数的整数,但是“(\d)\1”只能匹配“11”、“22”、“33”等数字相同两位数。当然,也可以重复引用子表达式,如“(\d)\1*”可以匹配“2”,“33”、“111”等各位数全同的整数。
如前所述,在正则表达式中,以下字符“*?+.()[]{}\”具有特殊的含义。如果需要查找这些字符本身,可以在该字符前加一个反斜杠“\”。例如查“\def”可以输入“\\def”。
三、使用实例
如下模块代码功能是,删除首字符的空格,但是不删除中间空格。
Sub 删除空格()
Dim reg As Object ‘定义reg为一个对象
Dim arr ‘定义一个动态数组
Dim i As Long, j As Long ‘分别定义i,j为长整型
i = Range(“A65536″).End(xlUp).Row ‘把A列非空的最后行数赋予给i
Columns(“B”).ClearContents ‘清空B列
arr = Range(“A1:A” & i) ‘把A列的数据赋予给数组arr
Set reg = CreateObject(“VBscript.RegExp”) ‘调用正则表达式
With reg ‘定义表达式
.Global = True ‘匹配所有搜索项
.ignorecase = True ‘不区分大小写
.Pattern = “^ ” ‘正则表达式(首空格)
End With
For j = 1 To i ‘循环该区域
Range(“B” & j) = reg.Replace(arr(j, 1), “”) ‘进行根据模板替换字符串为空值
Next
End Sub