ATL里的正则表达式问题

j8daxue 2010-02-23 05:04:11
第一次在程序里用到,百度下得到2篇有用文章
http://www.vckbase.com/document/viewdoc/?id=1256
http://blog.163.com/softtestddj/blog/static/111551117200992114332387/
发现实际要动手写还是有点麻烦的。

以前用find和substr写过以逗号为间隔提取字符串的函数,想试试正则表达式的用法。
第二篇文章里提到
"( ) 分组操作符。例如:(\d+,)*\d+匹配一串由逗号分开的数字,例如: "1"或"1,23,456"。 "
代码如下:

void TestRegExp(wchar_t* format,wchar_t* szMatch)
{
CAtlRegExp<> reExt;
if(REPARSE_ERROR_OK != reExt.Parse(format))
{
return ;
}
CAtlREMatchContext<> mcExt;
if(!reExt.Match(szMatch,&mcExt))
{
cout<<"un match"<<endl;
return ;
}
for(UINT i = 0 ; i < mcExt.m_uNumGroups ; i ++)
{
const CAtlREMatchContext<>::RECHAR* szStart = 0;
const CAtlREMatchContext<>::RECHAR* szEnd = 0;
mcExt.GetMatch(i,&szStart,&szEnd);
ptrdiff_t len = szEnd - szStart;
printf("%d: \"%.*s\"\n", i, len, szStart);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
TestRegExp(_T("(\d+,)*\d+"),_T("123,123"));
TestRegExp(_T("[0-9]+"),_T("102k3"));
return 0;
}

结果第一个不匹配,
第二个匹配了,却没输出结果,即mcExt.m_uNumGroups为0.
有用过的朋友还请指教。
...全文
177 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
forcal 2010-02-23
  • 打赏
  • 举报
回复
推荐使用DEELX 正则表达式:http://www.regexlab.com/

DEELX 的移植和使用非常简单,DEELX 的所有代码只有一个头文件(deelx.h),include 该头文件即可。

不需要为 DEELX 创建 project,也不需要添加任何 cpp 或者静态库 lib 文件。运行时,也不依赖专门的动态库。由于 deelx.h 已经直接包含到你的项目中,因此不会存在 Runtime Library 与主项目不同的问题,也不用担心会产生连接错误的问题。
j8daxue 2010-02-23
  • 打赏
  • 举报
回复
引用 9 楼 wangk 的回复:
引用 7 楼 j8daxue 的回复:[0-9]+匹配的应该是0-9的1个或N个数字

这个结果不是对的吗?由于没有分组,所以第二个
C/C++ code
TestRegExp(_T("[0-9]+"),_T("102k3"));
返回是对的啊。不明白楼主还有什么问题。

如果要102和3两组结果返回,请重新设计你第二个的正则表达式。

谢谢指点,看来一直是理解错了。。
wangk 2010-02-23
  • 打赏
  • 举报
回复
引用 7 楼 j8daxue 的回复:
[0-9]+匹配的应该是0-9的1个或N个数字


这个结果不是对的吗?由于没有分组,所以第二个

TestRegExp(_T("[0-9]+"),_T("102k3"));

返回是对的啊。不明白楼主还有什么问题。

如果要102和3两组结果返回,请重新设计你第二个的正则表达式。
gamezealot 2010-02-23
  • 打赏
  • 举报
回复
摘自:MSDN2005.
( )
Grouping operator. Example: (\d+,)*\d+ matches a list of numbers separated by commas (for example, "1" or "1,23,456").
----------------------------------------------------------------
楼主说的没错啊,这就是分组操作符,楼上的什么意思,呵呵!
j8daxue 2010-02-23
  • 打赏
  • 举报
回复
引用 6 楼 wangk 的回复:
我说的是第二个。

理解错了。
对于分组是什么概念并不清楚。从字面上看来
[0-9]+匹配的应该是0-9的1个或N个数字
wangk 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 j8daxue 的回复:
第一个疏忽了。。。
不知道为什么装不上MSDN,百度查到的,()就表示分组,()*意思即括号里的东西可以出现0~n次。


我说的是第二个。


TestRegExp(_T("[0-9]+"),_T("102k3"));
引用 1 楼 j8daxue 的回复:
第二个匹配了,却没输出结果,即mcExt.m_uNumGroups为0.
gamezealot 2010-02-23
  • 打赏
  • 举报
回复
都说ATL的Reg不好用,果然如此啊,楼主还是用boost吧,我用过那个,非常好用boost::regex。
j8daxue 2010-02-23
  • 打赏
  • 举报
回复
引用 3 楼 wangk 的回复:
第一个\在C++里要变成\\才对。

C/C++ code
TestRegExp(_T("(\\d+,)*\\d+"),_T("123,123"));

第二个哪里有看到分组?请去看看帮助文档的分组示例。

第一个疏忽了。。。
不知道为什么装不上MSDN,百度查到的,()就表示分组,()*意思即括号里的东西可以出现0~n次。
wangk 2010-02-23
  • 打赏
  • 举报
回复
第一个\在C++里要变成\\才对。


TestRegExp(_T("(\\d+,)*\\d+"),_T("123,123"));


第二个哪里有看到分组?请去看看帮助文档的分组示例。
ziplj 2010-02-23
  • 打赏
  • 举报
回复
没太用过ATL的正则 进来学习 jf
gamezealot 2010-02-23
  • 打赏
  • 举报
回复
第一个不匹配是因为字符串应该是(\\d+,)*\\d+,C++中\是转义字符。必须写两次表示\。
第二个应该匹配102和3才对。但返回的却为0,很奇怪。

16,473

社区成员

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

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

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