|
本帖最后由 liu-aguang 于 2014-6-17 16:38 编辑
(九)元字符字面字符表示法:转义符”\”
正则表达式用了一部分字符作为元字符,那么怎样在正则表达式中表示这些元字符的字面字符呢?它提供了一个称为转义元字符,即反斜杠来表示.例:表示字面点号可用”\.”;表示反斜杠的字面字符,用”\\”表示.下面列举了如果匹配字面字符必须转义的元字符:
提示:
1.注意并没有包括”]”,”-“,和”}”;
2.普通字符组[…]内部,元字符的转义有自己的规则,在下一章专门介绍.
例:正则表达式:
\d\.\d
可以匹配0.2,3.1….等小数.
(十)引用前面括号捕获的文本--反向引用
正则中,用形如\1,\2…的元字符序列表示前面捕获性括号内的字串(块),”\1”叫反向引用.如:
(abc)\1
可以匹配目标文本:abcabc,这里\1实际引用的是它左边括号中的内容”abc”.
(abc)(defg)\2
可以匹配目标文本:abcdefgdefg ,这里\2指的是从左至右第二个括号中的内容.
实例:删除一段英文中重复的单词.
目标文本:This this Is is an example.
结果文本:this is an example
正则表达式:
(\w+)\s+\1
代码:
Sub testrep()
Dim reg, s$
s = "This this is Is an exmapl"
Set reg =CreateObject("vbscript.regexp")
reg.Pattern = "(\w+)\s+\1"
reg.Global = True
reg.IgnoreCase = True
s = reg.Replace(s, "$1")
MsgBox s
End Sub
讨论:
正则表达式中,”\w+”表示匹配连续出现的单词字符.在本例中,它会匹配至空格为止;”\s+”匹配一个或多个空格; “\1”它会匹配左边第一个出现的括号中的相同内容.所以,该正则会匹配诸如”1 1” “1111 1111”之类的文本.
代码中Global属性设置为True,表示搜索所有匹配;IgnoreCase属性设置为True,表示忽略大小写,如”this” 与”THIS”视为同一单词.
代码使用了正则对象的Repalce方法,用$1替换找到的匹配. 这个例中,共找到两个匹配”This this”与”Is is”;而$1在前面已经说过它保存的是第一个捕获性括号内的内容.在本例中分别是This与Is.最终通过替换实现了删除重复单词的目的.
在VBA中使用反向引用要注意:
1. 是表示八进制转义的字符还是反向引用?
细心朋友已经发现,反向引用与字符的八制转义表示法,其结构是一样的.那么怎样区分它们呢?其规则是:
“\num”:假如num是一个可以看作八进制的数字.
如果num的值大于正则左前边捕获性括号个数,那么,它是一个八进制转义符;
如果num的值小于或等于正则左前边捕获性括号个数,那么,它是一个反向引用;
显然,如果它左前边没有捕获性括号,那么,它肯定是一个八进制转义符了.如果num数字中含有超过8,或9的数字,那么,它一定是反向引用.
2. \1,\2,…编号是根据前面”左半圆括号”从左至右出现的顺序确定的. |
|