使用CAtlRegExp匹配多个组

时间:2013-02-06 10:20:29

标签: c++ regex youtube-api atl

我正在尝试使用youtube数据api获取youtube播放列表的总持续时间。我从例如http://gdata.youtube.com/feeds/api/playlists/63F0C78739B09958下载响应,我的想法是迭代每个<yt:duration='xxx'/>出现xxx每个视频持续时间(以秒为单位),并将它们相加以获得总播放列表运行时间。

为了让每个人使用CAtlRegExp使用以下字符串:

<yt:duration seconds='{[0-9]+}'/>

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

我尝试了一些其他的正则表达式字符串,如

  • (<yt:duration seconds='{[0-9]+}'/>)

  • (<yt:duration seconds='{[0-9]+}'/>)*

然而,他们也没有工作(同样的原因)。

以下是源代码的摘录,其中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匹配<yt:duration ...的所有出现?

1 个答案:

答案 0 :(得分:1)

您将始终只有第一个(下一个)事件。要找到其他人,您需要将Match保持在循环中,直到找不到更多事件。

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