第一次在程序里用到,百度下得到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.
有用过的朋友还请指教。

解决方案 »

  1.   

    第一个不匹配是因为字符串应该是(\\d+,)*\\d+,C++中\是转义字符。必须写两次表示\。
    第二个应该匹配102和3才对。但返回的却为0,很奇怪。
      

  2.   

    没太用过ATL的正则  进来学习  jf
      

  3.   

    第一个\在C++里要变成\\才对。
    TestRegExp(_T("(\\d+,)*\\d+"),_T("123,123"));
    第二个哪里有看到分组?请去看看帮助文档的分组示例。
      

  4.   

    第一个疏忽了
    不知道为什么装不上MSDN,百度查到的,()就表示分组,()*意思即括号里的东西可以出现0~n次。
      

  5.   

    都说ATL的Reg不好用,果然如此啊,楼主还是用boost吧,我用过那个,非常好用boost::regex。
      

  6.   


    我说的是第二个。
        TestRegExp(_T("[0-9]+"),_T("102k3"));
      

  7.   

    摘自:MSDN2005.
    ( )
    Grouping operator. Example: (\d+,)*\d+ matches a list of numbers separated by commas (for example, "1" or "1,23,456").
    ----------------------------------------------------------------
     楼主说的没错啊,这就是分组操作符,楼上的什么意思,呵呵!
      

  8.   


    这个结果不是对的吗?由于没有分组,所以第二个TestRegExp(_T("[0-9]+"),_T("102k3"));返回是对的啊。不明白楼主还有什么问题。如果要102和3两组结果返回,请重新设计你第二个的正则表达式。
      

  9.   

    推荐使用DEELX 正则表达式:http://www.regexlab.com/DEELX 的移植和使用非常简单,DEELX 的所有代码只有一个头文件(deelx.h),include 该头文件即可。不需要为 DEELX 创建 project,也不需要添加任何 cpp 或者静态库 lib 文件。运行时,也不依赖专门的动态库。由于 deelx.h 已经直接包含到你的项目中,因此不会存在 Runtime Library 与主项目不同的问题,也不用担心会产生连接错误的问题。