увеличить группы захвата регулярного выражения - PullRequest
5 голосов
/ 27 мая 2011

После нескольких дней взлома и чтения мне не повезло с движком регулярных выражений 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. Я проверил это на других повторных парсерах, и, кажется, работает нормально. Что я делаю не так с бустом?

Заранее спасибо!

1 Ответ

1 голос
/ 27 мая 2011

согласно этой статье вы должны передать flag match_not_dot_newline алгоритму сопоставления.Я думаю, что это решит ваше дело.

...