第一次在程序里用到,百度下得到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.
有用过的朋友还请指教。
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.
有用过的朋友还请指教。
第二个应该匹配102和3才对。但返回的却为0,很奇怪。
TestRegExp(_T("(\\d+,)*\\d+"),_T("123,123"));
第二个哪里有看到分组?请去看看帮助文档的分组示例。
不知道为什么装不上MSDN,百度查到的,()就表示分组,()*意思即括号里的东西可以出现0~n次。
我说的是第二个。
TestRegExp(_T("[0-9]+"),_T("102k3"));
( )
Grouping operator. Example: (\d+,)*\d+ matches a list of numbers separated by commas (for example, "1" or "1,23,456").
----------------------------------------------------------------
楼主说的没错啊,这就是分组操作符,楼上的什么意思,呵呵!
这个结果不是对的吗?由于没有分组,所以第二个TestRegExp(_T("[0-9]+"),_T("102k3"));返回是对的啊。不明白楼主还有什么问题。如果要102和3两组结果返回,请重新设计你第二个的正则表达式。