求VC中ATL正则表达式CAtlRegExp的使用方法

永夜星空 2011-10-22 07:57:22
刚刚接触CAtlRegExp不久.以前一直以为VC不带正则表达式所以处理文本很是痛苦.
一般的文本文件我一直靠vbs来处理,但遇到要嵌入到VC程序的文本处理就郁闷了,所以前些天发现了有CAtlRegExp后真的兴奋不已,但是却遇到一些问题无法解决,网上也搜不到,最重要有如下的一个问题:
先看一段VBS里的正则表达式用法:

Dim reg,matchs
Set reg=New RegExp
reg.Pattern="(\d+)\.(\d+)\.(\d+)\.(\d+)"
Set matchs=reg.Execute("fjkdlsaj192.168.1.39iwiofda")
WScript.Echo matchs(0).Value '输出192.168.1.39
For Each match In matchs
WScript.Echo match.Submatches.Item(0) '输出192
WScript.Echo match.Submatches.Item(1) '输出168
WScript.Echo match.Submatches.Item(2) '输出1
WScript.Echo match.Submatches.Item(3) '输出39
Next
运行结果如下:
192.168.1.39
192
168
1
39

这是一个判断并提取IP地址各段的脚本,现在我想在VC里用CAtlRegExp来实现它.我写了如下代码:

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR buff[20]={0};
CString line=_T("fjdlau192.168.1.39jfkdlas");
CString pattern=_T("(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)");
CAtlRegExp<> reg;
int status=reg.Parse(pattern);
CAtlREMatchContext<> matchs;
BOOL b=reg.Match(line,&matchs);
if(b)
{
int nBytes=(DWORD)matchs.m_Match.szEnd-(DWORD)matchs.m_Match.szStart; //得到匹配字节数
::memcpy_s(buff,30,matchs.m_Match.szStart,nBytes); //复制匹配到buff
}
return 0;
}

提取"192.168.1.39"好象没发现问题,现在的问题是:我怎么得到这个IP串的各个段?
我单步调试的时候也没有发现有哪里存储了各个段的相关信息.
matchs有个叫m_Matches的成员变量,但是发现里面也只是存储了两个无效的指针.
不会需要再次分析这个结果吧,如果这样那方便性就大打折扣了.
...全文
411 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2011-10-26
  • 打赏
  • 举报
回复
BYTE IP[4];
_stscanf(pattern,_T("%d.%d.%d.%d"),&IP[0],&IP[1],&IP[2],&IP[3])
redui 2011-10-26
  • 打赏
  • 举报
回复
这个类是专给ATLSERVER用的,用来进行WEB服务器端编程,功能是在是个鸡肋。整个ATLSERVER只在VS2005中才有,以后的VS版本已经取消了,微软把它开源了,有一两个微软员工还在维护这些代码。

要使用标准的正则,可以用boost,如果嫌它大,可以直接加载微软的脚本引擎,js/vbs都可以,里面内置的正则库是标准的,操作系统自带。
永夜星空 2011-10-25
  • 打赏
  • 举报
回复
看到两位的的回答我心里瓦凉瓦凉的,这不会是说CAtlRegExp做不到像VBS正则表达式那样强大吧,那么这个类并不比自己写的文本分析类好多少。我一直期望VC里能有不用额外导入外部库(无论是dll还是lib)就能使用并像VBS中一样强大的正则表达式,难道这个愿望又落空了?
MoXiaoRab 2011-10-23
  • 打赏
  • 举报
回复
得到这个IP串的各个段直接用CString::split
redui 2011-10-22
  • 打赏
  • 举报
回复
别用这个类,它的正则格式是自定义的,跟流行的格式不同。你找找第三方库,或者跟VBS一样调用脚本来处理。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧