boost::regex
От: st0nx  
Дата: 20.05.11 08:05
Оценка:
Есть код:
#include <iostream>
#include <vector>
#include <boost/lexical_cast.hpp>
#include <boost/regex.hpp>
#include <fstream>

using namespace std;

int main()
{



    ifstream file("file.txt");
    ofstream file1("out.txt");

     while(!file.eof())
     {
        std::string fstring;
        boost::regex xRegEx("\/\/\/\< \[(.+?)\] - (.+)");
        boost::smatch xResults;
        std::getline(file, fstring);
        std::string::const_iterator xItStart = fstring.begin();
        std::string::const_iterator xItEnd = fstring.end();
        while( boost::regex_search(xItStart, xItEnd, xResults, xRegEx) )
        {
            file1 << boost::lexical_cast<std::string>(xResults[1]) <<" "<<boost::lexical_cast<std::string>(xResults[2]);
            xItStart = xResults[1].second;
        }
     }
    file.close();
    file1.close();
    return 0;
}


входной файл:

modbusdecl(ModbusTable, modbusR, StartShortAdress + 0, APP_N); ///< [0x500] — Номер применения
modbusdecl(ModbusTable, modbusR, StartShortAdress + 1, TT1.Value); ///< [0x501] — Температрура на притоке
...

необходимо получить в выходном:

0x500 Номер применения
0x501 Температрура на притоке
...

На выходе ничего не находится. Непонимаю почему. Регулярку тестил тут: _ttp://www.pcre.ru/eval/
Может в boost есть какие то особенности?
Re: boost::regex
От: const_volatile  
Дата: 20.05.11 08:49
Оценка: 3 (1)
Здравствуйте, st0nx, Вы писали:

S> boost::regex xRegEx("\/\/\/\< \[(.+?)\] — (.+)");


символы обратного слеша '\', которые в регулярном выражении эскейпят спецсимволы, должны в свою очередь эскейпиться в сишных строковых литералах. то есть любой бэкслеш в регэкспе в строковом литерале удваивается. кроме этого, у меня замечание по самому регэкспу. символы '/' и '<' специальными не являются и эскейпить их не нужно и даже опасно, поскольку в некоторых движках сочетание "\<" означает начало слова. вобщем, в вашем случае, строковый литерал должен выглядеть как "///< \\[(.+?)\\] — (.+)".
Re[2]: boost::regex
От: const_volatile  
Дата: 20.05.11 08:50
Оценка:
и предупреждаю, вниматильнее с копипейстом, rsdn меняет дефис '-' на длинное тире — .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.