C++ 将多个组与CAtlRegExp匹配

C++ 将多个组与CAtlRegExp匹配,c++,regex,youtube-api,atl,C++,Regex,Youtube Api,Atl,我正在尝试使用youtube数据api获取youtube播放列表的总持续时间。例如,我从下载响应,我的想法是迭代每个事件,其中xxx是以秒为单位的每个视频持续时间,并将它们相加以获得总播放列表运行时间 对于获取每个参数,我使用带有以下字符串的CAtlRegExp: 但是,它只匹配第一次出现,而不匹配任何其他出现(参考下面粘贴的源代码,循环只迭代一次) 我试过其他一些正则表达式字符串,比如 () ()* 然而,它们也不起作用(同样的原因) 这里是源代码的摘录,其中for循环只迭代一次,因为m

我正在尝试使用youtube数据api获取youtube播放列表的总持续时间。例如,我从下载响应,我的想法是迭代每个
事件,其中
xxx
是以秒为单位的每个视频持续时间,并将它们相加以获得总播放列表运行时间

对于获取每个参数,我使用带有以下字符串的
CAtlRegExp

但是,它只匹配第一次出现,而不匹配任何其他出现(参考下面粘贴的源代码,循环只迭代一次)

我试过其他一些正则表达式字符串,比如

  • ()

  • ()*

然而,它们也不起作用(同样的原因)

这里是源代码的摘录,其中for循环只迭代一次,因为
mcDuration.m_uNumGroups
等于
1

    //get video duration
    CAtlRegExp<> reDurationFinder;
    CAtlREMatchContext<> mcDuration; 

    REParseError status = reDurationFinder.Parse(_T("<yt:duration seconds='{[0-9]+}'/>"));

    if ( status != REPARSE_ERROR_OK )
    {
        // Unexpected error.
        return false;
    }

    if ( !reDurationFinder.Match(sFeed, &mcDuration) ) //i checked it with debug, sFeed contains full response from youtube data api
    {
        //cannot find video url
        return false;
    }

    m_nLengthInSeconds = 0;
    for ( UINT nGroupIndex = 0; nGroupIndex < mcDuration.m_uNumGroups; ++nGroupIndex )
    {
        const CAtlREMatchContext<>::RECHAR* szStart = 0;
        const CAtlREMatchContext<>::RECHAR* szEnd = 0;
        mcDuration.GetMatch(nGroupIndex, &szStart, &szEnd);

        ptrdiff_t nLength = szEnd - szStart;
        m_nLengthInSeconds += _ttoi(CString(szStart, nLength));
    }
//获取视频持续时间
CAtlRegExp修复文件;
CAtlREMatchContext mcDuration;
REParseError status=reDurationFinder.Parse(_T(“”));
如果(状态!=重新分析\u错误\u确定)
{
//意外错误。
返回false;
}
如果(!reDurationFinder.Match(sFeed,&mcDuration))//我用debug检查了它,那么sFeed包含来自youtube数据api的完整响应
{
//找不到视频url
返回false;
}
m_nLengthInSeconds=0;
对于(UINT nGroupIndex=0;nGroupIndex

如何使
CAtlRegExp
的所有事件相匹配您将始终只拥有第一次(下一次)事件。要查找其他项,您需要在循环中保持
匹配
,直到找不到更多项为止

    for(; ; )
    {
        CAtlREMatchContext<> MatchContext;
        pszNextText = NULL;
        if(!Expression.Match(pszText, &MatchContext, &pszNextText))
            break;
        // Here you process the found occurrence
        pszText = pszNextText;
    }
(;;)的

{
CAtlREMatchContext匹配上下文;
pszNextText=NULL;
if(!Expression.Match(pszText、&MatchContext、&pszNextText))
打破
//您可以在这里处理找到的事件
pszText=pszNextText;
}