使用正则表达式解析数字
Using regex to parse out numbers
我的问题或多或少是不言自明的,我想编写一个正则表达式来解析用户通过控制台输入的字符串中的数字。我使用以下方式获取用户输入:
getline(std::cin,stringName); //1 2 3 4 5
我假设用户输入了 N 个数字,然后输入白色 spaces 除了最后一个数字。
我通过像这样按字符分析字符串字符解决了这个问题:
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 << " ";
}
这个正则表达式在到达最后一个数字时出现问题,因为它后面没有 space,因此它进入了无限循环。有人可以告诉我如何解决这个问题吗?
你将在那里得到一个无限循环,因为你永远不会递增 begin
。如果这样做,您将获得除最后一个数字之外的所有数字(正如您所说,后面没有 space)。
但是我不明白为什么你觉得有必要在正则表达式中包含白色space。如果您只匹配一串数字,正则表达式将自动 select 最长的匹配,因此后面的字符(如果有)不能是数字。
我还发现正则表达式中的捕获没有任何价值。如果您想将捕获限制为数字本身,您会使用 ([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';
}
我的问题或多或少是不言自明的,我想编写一个正则表达式来解析用户通过控制台输入的字符串中的数字。我使用以下方式获取用户输入:
getline(std::cin,stringName); //1 2 3 4 5
我假设用户输入了 N 个数字,然后输入白色 spaces 除了最后一个数字。 我通过像这样按字符分析字符串字符解决了这个问题:
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 << " ";
}
这个正则表达式在到达最后一个数字时出现问题,因为它后面没有 space,因此它进入了无限循环。有人可以告诉我如何解决这个问题吗?
你将在那里得到一个无限循环,因为你永远不会递增 begin
。如果这样做,您将获得除最后一个数字之外的所有数字(正如您所说,后面没有 space)。
但是我不明白为什么你觉得有必要在正则表达式中包含白色space。如果您只匹配一串数字,正则表达式将自动 select 最长的匹配,因此后面的字符(如果有)不能是数字。
我还发现正则表达式中的捕获没有任何价值。如果您想将捕获限制为数字本身,您会使用 ([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';
}