本文示例源代码或素材下载
本文摘要翻译了几篇文章的内容,简单介绍 ATL CAtlRegExp,GRETA,Boost::regex 等正则表达式库,这些表达式库使我们可以方便地利用正则库的巨大威力,给我们的工作提供了便利。
正则表达式语法
字符元 | 意义 |
. | 匹配单个字符 |
[ ] | 指定一个字符类,匹配方括号内的任意字符。例:[abc] 匹配 "a", "b"或 "c"。 |
^ | 如果^出现在字符类的开始处,它否定了字符类,这个被否定的字符类匹配除却方括号内的字符的字符。如:[^abc]匹配除了"a", "b"和"c"之外的字符。如果^出现在正则表达式前边,它匹配输入的开头,例:^[abc]匹配以"a", "b"或"c"开头的输入。 |
- | 在字符类中,指定一个字符的范围。例如:[0-9]匹配"0"到"9"的数字。 |
? | 指明?前的表达式是可选的,它可以匹配一次或不进行匹配。例如: [0-9][0-9]? 匹配"2"或"12"。 |
+ | 指明?前的表达式匹配一次或多次。例如:[0-9]+匹配"1", "13", "666"等。 |
* | 指明*前的表达式匹配零次或多次。 |
??, +?, *? | ?, +和*的非贪婪匹配版本,它们尽可能匹配较少的字符;而?, +和*则是贪婪版本,尽可能匹配较多的字符。例如:输入"<abc><def>", 则<.*?> 匹配"<abc>",而<.*>匹配"<abc><def>"。 |
( ) | 分组操作符。例如:(d+,)*d+匹配一串由逗号分开的数字,例如: "1"或"1,23,456"。 |
转义字符,转义紧跟的字符。例如,[0-9]+ 匹配一个或多个数字,而 [0-9]+ 匹配一个数字后跟随一个加号的情况。反斜杠也用于表示缩写,a 就表示任何数字、字母。如果后紧跟一个数字n,则它匹配第n个匹配群组(从0开始),例如,<{.*?}>.*?</>匹配"<head>Contents</head>"。注意,在C++字符串中,反斜杠需要用双反斜杠\来表示: "\+", "\a", "<{.*?}>.*?</\0>"。 | |
$ | 放在正则表达式的最后,它匹配输入的末端。例如:[0-9]$匹配输入的最后一个数字。 |
| | 间隔符,分隔两个表达式,以正确匹配其中一个,例如:T|the匹配"The" 或"the"。 |
缩写匹配
缩写 | 匹配 |
a | 字母、数字([a-zA-Z0-9]) |
空格(blank): ([ \t]) | |
c | 字母([a-zA-Z]) |
d | 十进制数 ([0-9]) |
h | 十六进制数([0-9a-fA-F]) |
换行: ( |( ? )) | |
q | 引用字符串("[^"]*")|(''''[^'''']*'''') |
w | 一段文字 ([a-zA-Z]+) |
z | 一个整数([0-9]+) |
ATL CATLRegExp
ATL Server常常需要对地址、命令等复杂文字字段信息解码,而正则表达式是强大的文字解析工具,所以,ATL提供了正则表达式解释工具。
示例:
#include "stdafx.h"
#include <atlrx.h>
int main(int argc, char* argv[])
{
CAtlRegExp<> reUrl;
// five match groups: scheme, authority, path, query, fragment
REParseError status = reUrl.Parse(
"({[^:/?#]+}:)?(//{[^/?#]*})?{[^?#]*}(?{[^#]*})?(#{.*})?" );
if (REPARSE_ERROR_OK != status)
{
// Unexpected error.
return 0;
}
CAtlREMatchContext<> mcUrl;
if (!reUrl.Match(
"http://search.microsoft.com/us/Search.asp?qu=atl&boolean=ALL#results",
&mcUrl))
{
// Unexpected error.
return 0;
}
for (UINT nGroupIndex = 0; nGroupIndex < mcUrl.m_uNumGroups;
++nGroupIndex)
{
const CAtlREMatchContext<>::RECHAR* szStart = 0;
const CAtlREMatchContext<>::RECHAR* szEnd = 0;
mcUrl.GetMatch(nGroupIndex, &szStart, &szEnd);
ptrdiff_t nLength = szEnd - szStart;