我需要一些帮助来了解如何从boost :: sregex_iterator迭代搜索结果。基本上我在传递';'从命令行分隔的IP地址集,我希望能够使用boost :: sregex_iterator依次处理每个IP地址。
下面的代码演示了我要做的事情,并且还显示了使用 workingIterRegex 的变通方法 - 但是变通方法限制了我的正则表达式的丰富性。我尝试修改 nonworkingIterRegex ,但它只返回lambda的最后一个IP地址。
有没有人知道如何单独循环每个IP地址,而不必诉诸于这样一个被黑客攻击和简单化的workIterRegex。
我找到了以下http://www.cs.ucr.edu/~cshelton/courses/cppsem/regex2.cc来展示如何使用单个子匹配来调用lambda。
我还使用looping through sregex_iterator results中的示例来访问子匹配,但它给出了类似的结果。
使用workingIterRegex后,代码会打印出每行一个的IP地址
#include <string>
#include <boost/regex.hpp>
...
std::string errorMsg;
std::string testStr("192.168.1.1;192.168.33.1;192.168.34.1;192.168.2.1");
static const boost::regex nonworkingIterregex (
"((\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3});?)+",
boost::regex_constants::icase);
boost::smatch match;
if (boost::regex_match(testStr, match, nonworkingIterregex)) {
static const boost::regex workingIterRegex("[^;]+");
std::for_each(boost::sregex_iterator(
begin(iter->second), end(iter->second), workingIterRegex),
boost::sregex_iterator(),
[](const boost::smatch &match){
std::cout << match.str() << std::endl;
}
);
mNICIPAddrs = UtlStringUtils::tokenize(iter->second, ";");
std::string errorMsg;
} else {
errorMsg = "Malformed CLI Arg:" + iter->second;
}
if (!errorMsg.empty()) {
throw std::invalid_argument(errorMsg);
}
...
经过一些实验,我发现以下工作 - 但我不确定为什么c
答案 0 :(得分:1)
尝试使用这样的正则表达式:
(\\d{1,3}\\.){3}(\\d{1,3})