C ++ [std :: regex]尝试仅匹配数字,并且之间使用空格

时间:2019-04-29 23:24:49

标签: c++ regex

我正在使用C ++开发纸牌游戏,我想通过getline()获得一些用户输入。输入必须采用此特定格式:

“ 1 2 3 4 5 6”

数字范围是 1-11 ,每个数字必须分隔一个空格。用户正在为矢量输入索引号。假设他写了“ 1 2 3”,并且命中进入,则矢量对位置0、1和2进行了定位。

考虑到设计决定,让用户输入矢量(或基本上是他们的卡的)位置,我也接受其他建议。

玩家卡以“ 1 blue”的格式显示,并作为字符串存储在向量中。我认为用户输入整个卡名太麻烦了,所以我选择使用矢量索引。

下面是我的正则表达式字符串的代码段。可以,有点。它只是将整个字符串推入向量中,而缺少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 :(得分:0)

这无需使用正则表达式即可解决我的问题,非常感谢@Nick

  

为什么不使用std :: cin?或者将您的getline输出包装到   std :: stringstream并使用运算符>>一次读取数字,然后   然后验证他们?例如。 std :: stringstream stream(line); / *循环* /   流>> val;如果(val <0 || val> 11)...