C ++ [std :: regex] пытается сопоставить только числа с пробелами между - PullRequest
0 голосов
/ 30 апреля 2019

Я работаю над карточной игрой на C ++, где хочу получить пользовательский ввод через getline ().Входные данные должны быть в в этом конкретном формате:

"1 2 3 4 5 6"

Диапазон чисел 1-11 и каждое число должно быть разделено пробелом. Пользователь вводит индексные числа для вектора.Скажем, он пишет «1 2 3» и нажимает ввод, позиции 0, 1 и 2 обозначаются вектором.

Я также открыт для любых других рекомендаций, касающихся решения по проекту, позволяющего пользователю вводитьвектор (или, по сути, их карты) положение.

Карты игроков отображаются в этом формате «1 синий» и хранятся в виде строк в векторе.Я решил, что пользователю слишком сложно вводить полное имя карты, поэтому я решил использовать векторный индекс.

Ниже приведен фрагмент кода моей строки регулярного выражения.Это работает, вроде.Он просто выталкивает всю строку в векторе, пропуская 10. Но мне не нужен 1 элемент вектора, подобный этому: «1 2 3 4», мне нужно 4 элемента вектора, каждое число которых равно одному.

Вещи, которые не должны совпадать:

"1234567"

"abcdef"

"12 34 567 32"

Если вам нужен дальнейший контекст, я с удовольствием предоставлю это.

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

int main()
{
    int i = 0;

    std::regex rx("([[:digit:]]\\s)+([[:digit:]]\\s)+");
    std::string line = "1 2 3 4 5 6 7 8 9 10";
    std::smatch m;
    std::vector<std::string> catchit;

    while (regex_search(line, m, rx))
    {
        std::cout << "Pattern found " << m[i] << '\n';
        catchit.push_back(m[i]);
        line = m.suffix().str();
        i++;
    }
    return 0;
}

1 Ответ

0 голосов
/ 30 апреля 2019

Это решает мою проблему без использования регулярных выражений, большое спасибо @ Nick

Почему бы не std :: cin?Или обернуть свой вывод из getline в std :: stringstream и использовать оператор >>, чтобы читать числа по одному и затем проверять их?Например, std :: stringstream stream (line);/ * loop * / stream >> val;if (val <0 || val> 11) ...

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