C ++ [std :: regex]试图只匹配中间带空格的数字

问题描述 投票:0回答:1

我正在使用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;
}
c++ regex
1个回答
0
投票

这解决了我的问题,而不必使用正则表达式,非常感谢@Nick

为什么不std :: cin?或者将getline的输出包装在std :: stringstream中,并使用operator >>一次读取一个数字然后验证它们?例如。 std :: stringstream stream(line); / * loop * / stream >> val; if(val <0 || val> 11)...

© www.soinside.com 2019 - 2024. All rights reserved.