Использование регулярных выражений для анализа чисел - PullRequest
0 голосов
/ 24 апреля 2020

Моя проблема более или менее очевидна, я хочу написать регулярное выражение для анализа чисел из строки, которую пользователь вводит через консоль. Я принимаю пользовательский ввод, используя:

getline(std::cin,stringName); //1 2 3 4 5

Я предполагаю, что пользователь вводит N чисел, за которыми следуют пробелы, кроме последнего числа. Я решил эту проблему, проанализировав строку char с помощью char следующим образом:

std::string helper = "";
        std::for_each(stringName.cbegin(), strinName.cend(), [&](char c)
            {

                if (c == ' ')
                {
                   intVector.push_back(std::stoi(helper.c_str())); 
                    helper = "";
                }
                else
                    helper += c;
            });
        intVector.push_back(std::stoi(helper.c_str()));

Я хочу добиться того же поведения с помощью регулярных выражений. Я написал следующий код:

std::regex rx1("([0-9]+ )");
        std::sregex_iterator begin(stringName.begin(), stringName.end(), rx1);
        std::sregex_iterator end;
        while (begin != end) 
        {
            std::smatch sm = *begin;
            int number = std::stoi(sm.str(1));
            std::cout << number << " ";

        }

Проблема с этим регулярным выражением возникает, когда он достигает последнего числа, так как у него нет пробела, поэтому он входит в бесконечное число l oop. Может кто-нибудь дать мне представление о том, как это исправить?

1 Ответ

1 голос
/ 24 апреля 2020

Вы получите бесконечный l oop, потому что вы никогда не увеличите begin. Если вы сделаете это, вы получите все числа, кроме последнего (за которым, как вы говорите, не следует пробел).

Но я не понимаю, почему вы считаете необходимым включить пробел в регулярном выражении. Если вы просто сопоставите строку цифр, регулярное выражение автоматически выберет самое длинное из возможных совпадений, поэтому следующий символ (если есть) не может быть ди git.

. Я также не вижу значения в захвате в регулярное выражение Если бы вы хотели ограничить захват самим номером, вы бы использовали ([0-9]+). (Но поскольку stoi конвертирует только до тех пор, пока не найдет не-101 * *, это не имеет значения.)

Так что вы просто используете это:

std::regex rx1("[0-9]+");
for (auto it = std::sregex_iterator{str.begin(), str.end(), rx1},
          end = std::sregex_iterator{};
     it != end;
     ++it) {
    std::cout << std::stoi(it->str(0)) << '\n';
}          

( Живи на колиру )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...