Не особенно хорошо протестирован, но соответствует вашим двум случаям:
^\s*#include\s+(<([^"'<>|\b]+)>|"([^"'<>|\b]+)")
Единственная проблема в том, что из-за <и> результат может быть в группе захвата 2 или 3, поэтому вы должны проверить, если 2 пусто, а затем использовать 3 ... Преимущество над некоторыми другими ответами в том, что он не будет совпадать с чем-то вроде этого: #include "bad.h> или с этим: #include
А вот пример того, как использовать regcomp & friends:
static bool regexMatch(const std::string& sRegEx, const std::string& sSubject, std::vector<std::string> *vCaptureGroups)
{
regex_t re;
int flags = REG_EXTENDED | REG_ICASE;
int status;
if(!vCaptureGroups) flags |= REG_NOSUB;
if(regcomp(&re, sRegEx.c_str(), flags) != 0)
{
return false;
}
if(vCaptureGroups)
{
int mlen = re.re_nsub + 1;
regmatch_t *rawMatches = new regmatch_t[mlen];
status = regexec(&re, sSubject.c_str(), mlen, rawMatches, 0);
vCaptureGroups->clear();
vCaptureGroups->reserve(mlen);
if(status == 0)
{
for(size_t i = 0; i < mlen; i++)
{
vCaptureGroups->push_back(sSubject.substr(rawMatches[i].rm_so, rawMatches[i].rm_eo - rawMatches[i].rm_so - 1));
}
}
delete[] rawMatches;
}
else
{
status = regexec(&re, sSubject.c_str(), 0, NULL, 0);
}
regfree(&re);
return (status == 0);
}