我正在使用,std::regex
但一定是我做错了。我有这样的字符串:
127.27.18.4_2.125.2.365.24.2_10
我必须将“ _”之前的第一个字段设为IP,第二个字段将其设为snmp OID,最后一个字段设为轮询时间。这些是我的模式:
\\d+\\.\\d+\\.\\d+\\.\\d+_(\\d+\\.)(\\d+\\.*)+_\\d+
\\d+\\.\\d+\\.\\d+\\.\\d+
_(\\d+\\.)(\\d+\\.*)+_
对于最后一个,我只是从字符串末尾开始搜索一个数字。
这是我的代码:
string generalCast = "\\d+\\.\\d+\\.\\d+\\.\\d+_(\\d+\\.)(\\d+\\.*)+_\\d+";
string input = "";
string ip = "";
if (regex_match(input, regex(generalCast)))
{
string ipCast = "\\d+\\.\\d+\\.\\d+\\.\\d+";
string oidCast = "_(\\d+\\.)(\\d+\\.*)+_";
string oid = "";
string polling = "";
smatch matches;
if (regex_match(input, matches, regex(ipCast)))
{
ip = matches[0];
oid = "Error, bad OID: " + input;
if (regex_match(input, matches, regex(oidCast)))
{
oid = regex_replace((string)matches[0], regex("_"), "");
regex_match(input.cend(), input.cbegin(), matches, regex("\\d+"));
if (matches.length() > 0)
{
polling = matches[0];
}
}
}
}
情况是该程序从第一个if开始,但是在第二个中,当我只要求ip时,它不匹配。我习惯于在.Net和此类工作中使用正则表达式。
我究竟做错了什么?
我需要使用RE,因为我需要知道某个字段何时出错。在我使用之前:stringstream和getlines。
如果您坚持使用自己的代码,请参考以下固定代码段:
string generalCast = R"(\d+\.\d+\.\d+\.\d+_(\d+\.)(\d+\.*)+_\d+)";
string input = "127.27.18.4_2.125.2.365.24.2_10";
string ip = "";
if (regex_match(input, regex(generalCast)))
{
string ipCast = R"(\d+\.\d+\.\d+\.\d+)";
string oidCast = R"(_(\d+\.)(\d+\.*)+_)";
string oid = "";
string polling = "";
std::cout << "string object matched\n";
smatch matches;
if (regex_search(input, matches, regex(ipCast)))
{
std::cout << "ipCast matched: " << matches[0] << "\n";
ip = matches[0];
oid = "Error, bad OID: " + input;
smatch matches1;
if (regex_search(input, matches1, regex(oidCast)))
{
std::cout << "oidCast matched\n";
oid = regex_replace((string)matches1[0], regex("_"), "");
std::cout << "oid: " << oid << "\n";
smatch matches2;
regex_search(input, matches2, regex(R"(\d+$)"));
if (matches2.length() > 0)
{
polling = matches2[0];
std::cout << "Polling: " << polling << "\n";
}
}
}
}
事情发生了变化:
smatch
在每个块中声明每次,您不能重复使用它们regex_match
在开头使用(因为它需要完整的字符串匹配),然后,您需要使用regex_search
它,因为它允许部分匹配\d+
正则表达式将让你的第一个数字序列,而不是最后的(因此,你需要\d+$
的正则表达式)。R"(...)"
定义正则表达式时,使用原始字符串()更实用。如果您问我,我将使用以下类似内容(使用捕获机制):
string generalCast = R"((\d+(?:\.\d+){3})_(\d+(?:\.\d+)+)_(\d+))";
string input = "127.27.18.4_2.125.2.365.24.2_10";
std::regex rx(generalCast);
smatch m;
if (std::regex_match(input, m, rx)) {
std::cout << m[1].str() <<"\n";
std::cout << m[2].str() <<"\n";
std::cout << m[3].str() <<"\n";
}
结果:
127.27.18.4
2.125.2.365.24.2
10
正则表达式(应与整个字符串匹配)表示:
(\d+(?:\.\d+){3})
-1个或多个数字,然后出现3个.
+ 1个或多个数字_
-文字 _
(\d+(?:\.\d+)+)
-1个或多个数字,然后出现.
1个或多个+ 1个或多个数字_
-文字 _
(\d+)
-最后1个或多个数字本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句