WEB开发网
开发学院软件开发VC 对话框模板 RegexTest 阅读

对话框模板 RegexTest

 2006-07-19 11:31:19 来源:WEB开发网   
核心提示: CAtlRegExp<> re;re.Parse("a+b+");它将正则表达式解析为内部结构,这样一来你便可以用 CAtlREMatchContext 调用 Match 来得到匹配:CAtlREMatchContext<> mc;re.Matc
CAtlRegExp<> re;
re.Parse("a+b+");

它将正则表达式解析为内部结构,这样一来你便可以用 CAtlREMatchContext 调用 Match 来得到匹配:

CAtlREMatchContext<> mc;
re.Match("aaabbx", &mc);

与框架的 regex 类以及其它更成熟的实现相比,CAtlREMatchContext 多少土气一些。它有一个数据成员 m_Match,类型为 MatchGroup 结构,用于保存匹配的开始和结尾:

struct MatchGroup {
const RECHAR *szStart;
const RECHAR *szEnd;
};

此处 RECHAR 可以是任何在字符集中定义的字符类型;在实际应用中,如果使用的是默认的字符集,则它与 TCHAR 相同。CAtlREMatchContext 还可以在输入字符串中查找匹配的子分组。调用 Match 之后,mc.m_uNumGroups 保存匹配子分组的数目,你可以调用 GetMatch(i,...)来获得第 i 个子分组匹配。ATL 正则表达式的一个不可思议的事情之一是它使用花括弧来表示分组,而不是标准的圆括弧。例如:

CAtlRegExp<> re;
re.Parse("{a+}{b+}");
re.Match("aaabbx", &mc);

这段代码将找到一个匹配(“aaabb”),两个分组(“aaa”和“bb”)。ATL 会匹配常规的父分组,但你无法找到单独的子匹配,除非你使用花括弧。

CAtlRegExp 和 CAtlREMatchContext 在使用上显得有些笨拙。例如,为了找到所有匹配,你得用前一次匹配的 szEnd 指针作为下一个输入串的开始重复调用 Match。又不是研究火箭,为什么必须跟踪状态才能快速找到想要的所有匹配?于是我用一个简单的类 CRegex 对细节进行了封装,使编程更容易一些。主要的头文件如 Figure 5 所示,Figure 6 是我四月份文章中关于 ManWrap 的 RegexTest 程序,已经移植到 ATL。最初的程序是输入正则表达式和字符串,RegexTest 显示匹配和分组。它用 CRegex 来遍历匹配:

上一页  3 4 5 6 7 8 9  下一页

Tags:对话框 模板 RegexTest

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接