gpt4 book ai didi

c++ - 使用 CAtlRegExp 匹配多个组

转载 作者:行者123 更新时间:2023-11-28 07:47:02 29 4
gpt4 key购买 nike

我正在尝试使用 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 ... 的所有出现?

最佳答案

您将始终只有第一次(下一次)出现。要找到其他人,您需要使 Match 循环,直到找不到更多匹配项。

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

关于c++ - 使用 CAtlRegExp 匹配多个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726567/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com