VBA 正则表达式

①正则表达式的概述

  正则表达式原本是形式语言理论中的概念,与编译器的构造有密切的联系。但是作为一个应用软件的用户,我们没有必要去细究正则表达式的严格定义和处理方法。本文将从实用的角度出发,阐述引入正则表达式的目的、正则表达式的命令格式,以及如何利用正则表达式完成一些实际的文本处理工作。

  我们在处理文本时,经常会遇到一些具有某种特定格式,或者说满足某种规则的文本。比如,一个无符号的整数由一连串的数字构成,而一个Email地址的格式则是“用户名@主机名”,其中用户名是一串字母或数字,主机名则是由若干个由“.”分隔的字母数字串。正则表达式就是用来指定这种规则的。如果某个字符串满足正则表达式指定的规则,则称该字符串为正则表达式的一个“匹配串”。

  ②正则表达式的构成

  为了方便理解,让我们先来看看大家比较熟悉的数学表达式,“(x 3)*2 y”是一个典型的数学表达式。一个数学表达式由若干个“项”组成,“项”与“项”之间用加号或减号相连;这里“(x 3)*2”和“y”分别是两个项。每个项又由若干个“因子”组成,因子之间用乘号或除号相连;这里第一个项有两个因子“(x 3)”和“2”,而第二个项只有一个因子“y”。每个因子可以是一个简单的数,一个代数变量,也可以是放在括号里面的另一个表达式。对于最后一种情况,括号中的表达式称为“子表达式”;这里“x 3”就是一个子表达式。

  正则表达式的结构与数学表达式很相似。与数学表达式的“项”相对应,正则表达式由若干个“分支”构成,“分支”之间用符号“|”相连。从逻辑上讲,分支之间是一种“或”的关系,一个字符串只要与正则表达式中的任何一个分支相匹配,这个字符串就与整个正则表达式相匹配。比如,“第三人称代词”可以用正则表达式表示为“他|她|它|他们|她们|它们”。

  与数学表达式的“因子”相对应,构成正则表达式“分支”的部件称为“原子”。“原子”与“原子”之间没有任何符号相连。从逻辑上讲,原子之间是串接的关系,一个字符串必须与各个原子依次相匹配,才算与这个分支相匹配。比如在上面的例子中,分支“他们”由两个原子“他”和“们”组成。

  正则表达式的本质是它的“原子”可以有多种不同的形式。前面的例子是最简单的情形,即每个原子由一个普通字符组成。除此以外,“原子”还可以是特殊符号、通配符、字符集以及子表达式。

  A、特殊符号

  可以作为特殊符号的原子有:

  ^ 匹配行首。例如,“^他”匹配出现在行首的“他” 字。值得注意的是,这个符号仅仅表示“行首”这个 位置,与它相匹配的字符串长度为0;

  $ 匹配行末。与“^”相似,它仅表示“行末”这个位 置。例如,“。$”匹配出现在行末的句号;

  < 匹配词首。词首的定义是紧接在非字母数字之后的第 一个字母数字或下划线(_),汉字永远是词首。与“^” 相似,它仅表示“词首”这个位置,匹配长度为0;

  > 匹配词尾。词尾是指紧接在字母数字或下划线之后的 第一个非字母数字下划线,任一汉字之后也属于词尾。 词尾的匹配长度也是0;

  \t TAB字符;

  \e ESC字符;

  B、通配符

  通配符是用一个符号(或几个符号组合)来匹配某一类满足条件的字符。可以使用通配符来查找字符是正则表达式的一大特点。通配符(注意大小写的区别):

  半角部分: .(句点) 匹配任何字符; \a 匹配任意英文字母; \~a 匹配除字母外的任意字符; \d 匹配任意数字; \~d 匹配除数字外的任意字符; \h 匹配任意词首字符(字母及下划线); \~h 匹配除字母及下划线以外的任意字符; \l 匹配任意小写字母; \~l 匹配除小写字母外的任意字符; \o 匹配任意八进制数字相匹配(0-7); \~o 匹配除八进制数字外的任意字符; \p 匹配任意半角标点符号; \~p 匹配除半角标点以外的任意字符; \s 匹配任意空白字符(空格、TAB); \~s 匹配任意非空白字符; \u 匹配任意大写字母; \~u 匹配除大写字母外的任意字符; \w 匹配可成词的字符(字母、数字及下划线); \~w 匹配成词字符外的任意字符; \x 匹配任意十六进制数字(0-9,a-f, A-F); \~x 匹配除十六进制数字外的任意字符;

  全角部分: \f 匹配任意双字节字符(汉字或全角符号); \~f 匹配任意单字节字符; \A 匹配任意全角ASCII字符; \b 匹配任意收录在BIG5码集中的双字节字符; \~b 匹配未收录在BIG5码集中的双字节字符; \c 匹配任意汉字(不包括符号); \~c 匹配非汉字的双字节字符; \D 匹配地支字符(子丑寅卯……); \g 匹配收录在GB码集中的双字节字符; \~g 匹配非收录在GB码集中的双字节字符; \k 匹配日文片假名; \K 匹配日文平假名; \m 匹配小写希腊字母; \M 匹配大写希腊字母; \n 匹配中文数字(一二三四……); \N 匹配大写中文数字(壹贰叁肆……); \P 匹配全角标点符号; \r 匹配小写俄文字母; \R 匹配大写俄文字母; \s 匹配数学符号; \S 匹配中文序号(⒈⒉⒊⒋……); \T 匹配天干字符(甲乙丙丁……); \V 匹配竖排标点符号; \y 匹配拼音字符; \Y 匹配注音字符; \Z 匹配制表字符;

  C、字符集

  字符集是用一对方括号[]括起来的字符串,用以匹配字符集中的任何一个字符。比如“[他她它]”匹配单数第三人称代词。如果方括号中的第一个字符是"^",则匹配除指定字符外的任何其它字符。在字符集中,还可以用"-"表示字符的范围,例如“[a-z]”匹配任何小写字母。注意尽量不要用“-”表示汉字的范围,因为汉字并没有公认的次序,目前是依据汉字内码来确定范围的。如果两个汉字的内码相差很大,将消耗大量的内存,运算也将非常缓慢。为了避免这种现象,限制表示范围的起始与终止汉字必须位于同一区。如果字符集要包括字符“]”、“^”、“-”或“\”,可以在这些字符前加“\”。例如“[\^xyz]”匹配"^", "x","y"或"z"。另外需要特别指出的是,前面所述的特殊字符及通配符,除了"\t"和"\e"外,在字符集中均作为普通字符处理。

  字符集的匹配速度比通配符慢,所以应该尽可能地使用通配符。例如要查找半角数字时,应该使用\d,而不要使用[0-9],虽然后者也是正确的。

  D、子表达式

  子表达式是指用一对括弧()括起来的另外一个正则表达式。使用子表达式有两种主要的目的。一是改变匹配的优先级,例如“中|西文软件”匹配的是“中”或“西文软件”,但是“(中|西)文软件”匹配的是“中文软件”或“西文软件”。

  使用子表达式的另一个目的,是引用前面匹配到的内容。例如要查找形如“哈哈”、“嘻嘻”的叠字词,可以写“(\c)\1”。这里“(\c)”匹配任意汉字,而“\1”则引用匹配到的内容。允许在一个查找串包含最多9个子表达式,它们的匹配内容可以分别用“\1”,“\2”...“\9”来加以引用。子表达式也可以嵌套另一个子表达式,子表达式左括号出现的序号为这个表达式的编号。另外需要注意的是,只能引用已经匹配了的子表达式,象上面的例子不可以写成“\1(\c)”,同理,也不应该引用不同分支中的子表达式,因为一个正则表达式中只可能有一个分支被匹配。


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”。


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值