Thursday, July 25, 2013

regexp в C++

К своей радости узнал, что в VS2008 появились регулярные выражения TR1 в STL
Подробности тут: A TR1 Tutorial: Regular Expressions

А мне как раз понадобилось на С++ парсить исходники С++ на предмет поиска параметров printf() , имеющих следующий прототип:
%[flags][width][.precision][length]specifier
После долгой возни вокруг \t \n вот что у меня получилось:

#include <string>
#include <regex>

// text - printf format input, for instance:
//        "Unable to create %s!/nUnsufficient RAM: %3d."
//
// arr  - output array of printf format parameters, in this case:

//        {"%s", "\n", "%3d"}
int GetPrintfParameter(CString text,CStringArray & arr)
{
    text.TrimLeft();
    text.TrimRight();
    if(text.IsEmpty() )return 0;

    std::string prinfFormat = text;
    const std::tr1::regex pattern("((%(\\+|-|0|\\#)?(\\d+|\\*)?(.\\d+|.\\*)?(\\d)?(d|i|u|o|x|f|e|g|a|c|s|p|n|\\%))|(\\\\n|\\\\t|\\|))");
    const std::tr1::sregex_token_iterator end;
     for ( std::tr1::sregex_token_iterator i(prinfFormat.begin(),  prinfFormat.end(), pattern);
              i != end;
            ++i )
     {
       CString sep = (*i).str().c_str();
       arr.SetSize(arr.GetSize()+1);
       arr[arr.GetSize()-1] = sep;
     }

    return arr.GetSize();
}