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