C ++中的STD正则表达式

ars1614

我正在使用,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,因为我需要知道某个字段何时出错。在我使用之前:s​​tringstream和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";
            }
        }
    }
}

IDEONE演示

事情发生了变化:

  • 您需要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";
}

观看另一个IDEONE演示

结果:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C中解析正则表达式

来自分类Dev

C ++中的正则表达式字符类减法

来自分类Dev

XML中的C#正则表达式标记

来自分类Dev

正则表达式在C#中不匹配

来自分类Dev

C ++ 11中的正则表达式替换

来自分类Dev

C中的正则表达式无法正常工作

来自分类Dev

C#正则表达式中的无效字符

来自分类Dev

用于C中IP地址的正则表达式

来自分类Dev

C#中的正则表达式问题

来自分类Dev

正则表达式不能在C中工作

来自分类Dev

卡在C#中的正则表达式上

来自分类Dev

C ++中的多行正则表达式模式

来自分类Dev

C#中的正则表达式,包括注释

来自分类Dev

C ++中的正则表达式编译错误

来自分类Dev

C中的正则表达式匹配

来自分类Dev

C中的HTTP标头的正则表达式

来自分类Dev

C#中的正则表达式模式问题

来自分类Dev

C#中的正则表达式

来自分类Dev

标准C ++中的正则表达式

来自分类Dev

C ++中的正则表达式问题

来自分类Dev

用于C中IP地址的正则表达式

来自分类Dev

C中的正则表达式无法正常工作

来自分类Dev

C#中的数据注释正则表达式

来自分类Dev

C#正则表达式中的无效字符

来自分类Dev

C#中的正则表达式,包括注释

来自分类Dev

正则表达式替换C#中的标签

来自分类Dev

正则表达式中的C#错误

来自分类Dev

C#中的正则表达式匹配空格

来自分类Dev

C ++中的正则表达式不正确