2013-02-06 55 views
0

我試圖使用youtube數據api獲得YouTube播放列表的總持續時間。我從例如http://gdata.youtube.com/feeds/api/playlists/63F0C78739B09958下載響應,我的想法是遍歷每個<yt:duration='xxx'/>發生的地方,其中xxx是以秒爲單位的每個視頻持續時間,並總結它們以獲得總播放列表運行時間。匹配不止一個組與CAtlRegExp

爲了得到每個i使用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

您將始終只有第一個(下一個)事件。要找到其他人,您需要保持Match循環,直到找不到更多事件。

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