Регулярное выражение для соответствия C #include файл

При необходимости в чем-то простом это отвечало бы всем требованиям?

Map myCache = Collections.synchronizedMap(new WeakHashMap());

Это, который сохраняет на диск привычка, но Вы сказали, Вы хотели простой...

Ссылки:

(Поскольку Adam прокомментировал, синхронизируя карту, поражали производительность. Не высказывание идеи не имеет волос на нем, но было бы достаточно как быстрое и грязное решение.)

7
задан Justicle 14 September 2009 в 07:17
поделиться

4 ответа

Вот что я написал:

#include ((<[^>]+>)|("[^"]+"))

Подходит ли?

7
ответ дан 6 December 2019 в 11:50
поделиться

Это даст лучшие результаты:

^\s*\#include\s+["<]([^">]+)*[">]

Затем вы хотите посмотреть на первую группу захвата, когда вы найдете совпадение.

Вы не говорите, какой язык вы используете, фактор, который вы Упоминание regcomp () наводит меня на мысль, что вы используете библиотеку регулярных выражений POSIX в C. Если это верно, тогда вы хотите использовать функцию regexec и использовать параметры nmatch и pmatch для получения первой группы захвата.

5
ответ дан 6 December 2019 в 11:50
поделиться

Не особенно хорошо протестирован, но он соответствует вашим двум случаям:

^\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);
 }
1
ответ дан 6 December 2019 в 11:50
поделиться

Вы можете попробовать следующее регулярное выражение:

(^\s*\#\s*include\s*<([^<>]+)>)|(^\s*\#\s*include\s*"([^"]+)")

Я предпочитаю иметь отдельное регулярное выражение для
#include <>
и
#include ""

2
ответ дан 6 December 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: