использование строковых итераторов над char* в регулярном выражении boost

Я пытаюсь найти char *, чтобы найти совпадения и сохранить каждое совпадение в виде структуры, используя регулярное выражение boost. Я не знаю, как использовать итераторы std::string вместо char*. Поэтому я создал std::string из char* и использовал их. Но теперь мне нужны указатели в исходном char*, которые можно найти только с помощью созданного мной std::string. См. следующий код. Комментарии должны развеять ваши сомнения.

typedef struct {
 void *pFind; // Pointer to begining of match   
 int lenFind; // Length of match
} IppRegExpFind;



bool regExSearch(int nStrLen /*Length of input string*/, 
             std::vector<IppRegExpFind>& vectResult /*vector of struct to store matches*/, 
             int &numMatches /* number of matches*/, 
             const char *sStrInput /*Input string to be searched*/,
             const char *sStrRegex /*Input regex string*/)
{
 bool bStatusOk = true;
 try{
     std::string regexStr(sStrRegex);
     std::string inputStr(sStrInput);
     static const boost::regex ex(regexStr);
     std::string::const_iterator start, end;
     start = inputStr.begin();
     end = inputStr.end();
     boost::match_results<std::string::const_iterator> what; 
     boost::match_flag_type flags = boost::match_default; 
     std::vector <std::string> matches;
     while(boost::regex_search(start, end, what, ex, flags))
        {
         matches.push_back(what.str());
         start = what[0].second;
        }
    //  convert boost:match_Results to a vector of IppRegExpFind
   }
   catch(...){
    bStatusOk = false;
    }
return bStatusOk;
}

person Community    schedule 17.02.2009    source источник


Ответы (1)


Вы можете получить исходный указатель с помощью

sStrInput+what.position(0)

Однако я не уверен, зачем вам нужны все трюки с std::string. Согласно документации, boost::regex_search может выполнять поиск в любом диапазоне, указанном двунаправленными итераторами (т. е. char* — это двунаправленный итератор, поэтому вы передаете (str, str+strlen(str)) как начало и конец), и существуют даже перегрузки для char*, которые обрабатывают его как C нить.

person jpalecek    schedule 17.02.2009