从C++到.NET:正则表达式2009-12-25 MSDN/ Stanley B. Lippman从 ISO-C++ 转移到 C++/CLI 的一个最大好处体现在功能强大的 Microsoft® .NET Framework 类库 (FCL),该类库可以直接使用。许多读者都知道 FCL 所支持的那些更具吸引力的技术方面,如 Web 服务、联网功能、线程、ASP.NET,等等。在本专栏中,我将介绍 .NET Framework 对正则表达式的支持。由于 ISO-C++ 不提供对正则表达式的标准支持,我的 TQL 应用程序(在此前的“从 C++ 到 .NET”专栏中介绍过)在所有模式匹配中使用了标准字符串类。例如,在需要对文本中出现的词进行标准化的情况下便是如此,比如将“tried”、“tries”和“trying”均视为“try”的一个实例。转移到 C++/CLI 之后,我便可以采用更加准确和强大的 .NET 正则表达式支持功能来代替字符串处理过程。这正是我希望在下一个专栏中讨论的内容。在此我们先对正则表达式做一个简要的介绍。在我们介绍 FCL 如何支持正则表达式之前,最好先对什么是正则表达式以及如何使用正则表达式有所了解。正则表达式是由字符和符号构成的模式,其中符号表示任意长度的字符串。例如,假设您需要查找所有以某个字符串开头的文本行。条件是:文本行必须以数字 5 开头,数字的长度任意,但必须以 -(短横线)结尾(5- 将是最短的匹配字符串,不过 51- 和 510- 等字符串也匹配);-(短横线)必须后跟字母 a、b 或 c - 例如,51-a、511100101-b,等等;接着必须后跟一个或多个字母或字符,但以字符串 2001 结束(我知道,这看起来有些怪异,但这正是可以使用正则表达式表示的那类字符串)。为了使用正则表达式表示此字符串的规则,您需要使用一组符号来执行以下操作:首先,指出您希望从文本行开头处开始搜索。这需要使用补注符号 (^) 来实现。例如,^5 表示您希望查找以文字值 5 开头的文本行。第二,指明您希望按特殊形式的字符进行匹配。例如,d 表示您希望匹配 0-9 中的一个数字,D 表示您希望匹配一个非数字字符。(就技术而言,d 和 D 也可以用于国际数字,这一点已在 Raymond Chen 的博客中予以介绍,网址为 blogs.msdn.com/86555.aspx。)s 表示您希望匹配单个空格字符,S 表示您希望匹配单个非空格字符。w 用于匹配任何字母和数字 [a-z、A-Z、0-9],W 用于匹配除字母和数字之外的字符。第三,指明您希望匹配任意字符,类型不限。例如,句点 (.) 用于匹配任意非换行字符。第四,指明您希望匹配某个字符类型的多个实例,或不匹配其实例。加号运算符 (+) 表示您希望匹配同一类型的一个或多个字符。例如,d+ 用于匹配“2”、“22”、“1217”,等等。以下正则表达式匹配符合条件(以 5 开头,后跟一位或多位数字,再后跟一个或多个非数字字符,最后是字符 2001)的任意行:^5d+D+2001
如果您不确定是否 5 应后跟一位或多位数字怎么办?您希望能够灵活地指明可以接受任意数量的数字或非数字。这可以使用星号 (*) 来实现。例如,让我们将上一个示例转变一下,其中 5 可以后跟 0 个或多个数字,再后跟 0 个或多个非数字字符,但是以字符 2001 结尾:^5d*D*2001
第五,指明您希望匹配固定数量的字符。以下正则表达式要求三个数字后跟一个连字符,再后跟四个数字(像是一个电话号码),如 375-4128:d{3}-d{4}