При необходимости в чем-то простом это отвечало бы всем требованиям?
Map myCache = Collections.synchronizedMap(new WeakHashMap());
Это, который сохраняет на диск привычка, но Вы сказали, Вы хотели простой...
Ссылки:
(Поскольку Adam прокомментировал, синхронизируя карту, поражали производительность. Не высказывание идеи не имеет волос на нем, но было бы достаточно как быстрое и грязное решение.)
Вот что я написал:
#include ((<[^>]+>)|("[^"]+"))
Подходит ли?
Это даст лучшие результаты:
^\s*\#include\s+["<]([^">]+)*[">]
Затем вы хотите посмотреть на первую группу захвата, когда вы найдете совпадение.
Вы не говорите, какой язык вы используете, фактор, который вы Упоминание regcomp () наводит меня на мысль, что вы используете библиотеку регулярных выражений POSIX в C. Если это верно, тогда вы хотите использовать функцию regexec и использовать параметры nmatch и pmatch для получения первой группы захвата.
Не особенно хорошо протестирован, но он соответствует вашим двум случаям:
^\s*#include\s+(<([^"'<>|\b]+)>|"([^"'<>|\b]+)")
Единственная проблема в том, что из-за элементов <и> результат может быть в группе захвата 2 или 3, поэтому вы должны проверить, пусто ли 2, а затем использовать 3 ... Преимущество перед некоторыми другими ответами в том, что он не будет соответствовать sth, например: #include "bad.h> или так: #include
А вот пример использования (обертывания) regcomp и друзей:
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);
}
Вы можете попробовать следующее регулярное выражение:
(^\s*\#\s*include\s*<([^<>]+)>)|(^\s*\#\s*include\s*"([^"]+)")
Я предпочитаю иметь отдельное регулярное выражение для
#include <>
и
#include ""