Использование Boost-Regex для разбора строки на символы и цифры - PullRequest
2 голосов
/ 24 мая 2011

Я бы хотел использовать библиотеку Boost's Regex для разделения строки, содержащей метки и цифры, на токены.Например, 'abc1def002g30' будет разделен на {'abc','1','def','002','g','30'}.Я изменил пример , приведенный в документации Boost, чтобы получить следующий код:

#include <iostream>
#include <boost/regex.hpp>

using namespace std;

int main(int argc,char **argv){
    string s,str;
    int count;
    do{
        count=0;
        if(argc == 1)
        {
            cout << "Enter text to split (or \"quit\" to exit): ";
            getline(cin, s);
            if(s == "quit") break;
        }
        else
            s = "This is a string of tokens";

        boost::regex re("[0-9]+|[a-z]+");
        boost::sregex_token_iterator i(s.begin(), s.end(), re, 0);
        boost::sregex_token_iterator j;
        while(i != j)
        {
            str=*i;
            cout << str << endl;
            count++;
            i++;
        }
        cout << "There were " << count << " tokens found." << endl;

    }while(argc == 1);
    return 0;
}

Количество токенов, хранящихся в count, является правильным.Однако *it содержит только пустую строку, поэтому ничего не печатается.Любые предположения относительно того, что я делаю неправильно?

РЕДАКТИРОВАТЬ: согласно исправлению, предложенному ниже, я изменил код, и теперь он работает правильно.

1 Ответ

2 голосов
/ 24 мая 2011

Из документов на sregex_token_iterator:

Эффекты: создает regex_token_iterator, который будет перечислять одну строку для каждого совпадения регулярного выражения выражения, найденного в последовательности [a, b), используя флаги соответствия m (смотрите match_flag_type).Перечисленная строка - это подвыражение подвыражения для каждого найденного соответствия; если submatch равен -1, тогда перечисляются все текстовые последовательности, которые не соответствуют выражению re (то есть для разделения поля)

Поскольку ваше регулярное выражение соответствует всем элементам (в отличие от примера кода, что соответствует только строкам), вы получите пустые результаты.

Попробуйте заменить его на 0.

...