После нескольких дней взлома и чтения мне не повезло с движком регулярных выражений boost, надеюсь, кто-то здесь может помочь.
Я хочу получить первое поле из каждой строки, где последнее поле соответствует некоторому вводу.
string input =
"449 a dingo ate my baby THING\n"
"448 a dingo ate my baby THING\n"
"445 a dingo ate my baby BOOGNISH\n"
"446 a dingo ate my baby BOOGNISH\n"
"447 a dingo ate my baby STUFF\n";
Допустим, я передал своему регулярному выражению следующую строку ...
string re = "^([0-9]+).+?boognish$";
boost::regex expression(re,boost::regex::perl | boost:regex::icase);
, а затем настройте мой матч
const int subs[] = { 0, 1 };
boost::sregex_token_iterator it(input.begin(), input.end(), expression, subs);
boost::sregex_token_iterator end;
while ( it != end )
{
fprintf(stderr,"%s|\n", it->str().c_str());
*it++;
}
Вот вывод, который я получаю от наддува, имейте в виду, что я запросил совпадение всей строки и группы 1, я также попросил "|" так что мы можем легко увидеть конец строки:
449 a dingo ate my baby THING
448 a dingo ate my baby THING
445 a dingo ate my baby BOOGNISH|
449|
446 a dingo ate my baby BOOGNISH|
446|
Я действительно хочу 445 | и 446 | только, но это дает мне 449 (пока он не достигнет первого BOOGNISH), а затем 446. Я проверил это на других повторных парсерах, и, кажется, работает нормально. Что я делаю не так с бустом?
Заранее спасибо!