对话框模板 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 来遍历匹配:
更多精彩
赞助商链接