【问题标题】:Using regex to parse out numbers使用正则表达式解析数字
【发布时间】:2020-08-08 00:09:41
【问题描述】:

我的问题或多或少是不言自明的,我想编写一个正则表达式来解析用户通过控制台输入的字符串中的数字。我使用以下方式获取用户输入:

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

我假设用户输入了 N 个数字,后跟空格,最后一个数字除外。 我已经通过像这样分析字符串 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 << " ";

        }

这个正则表达式的问题发生在它到达最后一个数字时,因为它后面没有空间,因此它进入了一个无限循环。有人可以告诉我如何解决这个问题吗?

【问题讨论】:

标签: c++ regex string parsing regex-group


【解决方案1】:

因为你永远不会增加begin,所以你会在那里得到一个无限循环。如果你这样做,你会得到除最后一个以外的所有数字(正如你所说,后面没有空格)。

但我不明白您为什么觉得有必要在正则表达式中包含空格。如果只匹配一串数字,正则表达式会自动选择最长的匹配,所以后面的字符(如果有的话)不能是数字。

我也看到正则表达式中的捕获没有任何价值。如果您想将捕获限制为数字本身,您将使用([0-9]+)。 (但由于stoi 只转换直到找到非数字,所以没关系。)

所以你只需使用这个:

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';
}          

(Live on coliru)

【讨论】:

  • 谢谢!这样就解决了!我的意思是我没有增加开始这一事实解释了很多。和 Wiktor 的修改,所以我原来的正则表达式似乎可以完成这项工作。至于我为什么要包含空格,是因为我认为可以输入 N 位数字。
  • @remax:你看过我的示例运行了吗?正则表达式中没有空格,它可以完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2011-08-10
  • 1970-01-01
  • 2015-07-08
  • 2012-08-23
相关资源
最近更新 更多