将变量(数组类型)从函数传递到“main”范围类型:std :: tr1 :: match_results <std :: string :: const_iterator> </std :: string :: const_iterator>

时间:2012-03-20 19:20:46

标签: c++ regex

我想将函数中的变量传递给我正在调用的主要作用域,我试图像在C中那样做,但它什么都不返回。

我希望能够在函数返回后输出并处理它

#include "StdAfx.h"
#include <regex>
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

std::tr1::match_results<std::string::const_iterator> match(std::string& regex, const std::string& ip,std::tr1::match_results<std::string::const_iterator> res)
{
   const std::tr1::regex pattern(regex.c_str());
   bool valid = std::tr1::regex_match(ip, res, pattern);
   std::cout << ip << " \t: " << (valid ? "valid" : "invalid") << std::endl;
   cout << "FIRST RES FOUND: " << res[1] << endl;  
   return res;
}

int main()
{

   string regex = "(\\d{1,3}):(\\d{1,3}):(\\d{1,3}):(\\d{1,3})";
   string ip = "49:22:33:444";
   std::tr1::match_results<std::string::const_iterator> res;
   match(regex,ip.c_str(), res);

   cout << "Result >" << res[1] << "< " << endl;


   _getch(); return 0;
}

当我编译并运行时,输出为:“FIRST RES FOUND:49 结果&gt;&lt;“

这可能是一个非常简单的解决方案,但是如何为我的主设置它可以正确读取它,如:“结果&gt; 49&lt;”

提前致谢。 :)

2 个答案:

答案 0 :(得分:3)

选项1:使用参考

void match(string& regex, const string& ip, tr1::match_results<string::const_iterator> & res)
{
   const tr1::regex pattern(regex.c_str());
   bool valid = tr1::regex_match(ip, res, pattern);
   cout << ip << " \t: " << (valid ? "valid" : "invalid") << endl;
   cout << "FIRST RES FOUND: " << res[1] << endl;
}

选项2:按值返回结果并存储:

tr1::match_results<string::const_iterator> match(string& regex, const string& ip)
{
    tr1::match_results<string::const_iterator> res;
    // ...
    return res;
}

int main()
{
    // ...
    tr1::match_results<string::const_iterator> res = match(regex, ip);
}

单独注意,绝对不需要所有c_str()次调用,因为<regex>具有功能完善的std::string接口。查看文档以获取详细信息,您只需要获得几个类型名称。


编辑:以下是使用std::string的一些基本示例。 std::wstringchar*wchar_t*有相同的结构,但std::string应该是最有用的结构。

由于<regex>支持仍然不完整,您也应该考虑TR1和Boost替代方案;我提供这三个,你可以选择一个:

namespace ns = std;          // for <regex>
namespace ns = std::tr1;     // for <tr1/regex>
namespace ns = boost;        // for <boost/regex.hpp>

ns::regex r("");
ns::smatch rxres;            // 's' for 'string'

std::string data = argv[1];  // the data to be matched

// Fun #1: Search once

if (!ns::regex_search(data, rxres, r))
{
    std::cout << "No match." << std::endl;
    return 0;
}


// Fun #2:  Iterate over all matches

ns::sregex_iterator rt(data.begin(), data.end(), r), rend;

for ( ; rt != rend; ++rt)
{
    // *rt is the entire match object

    for (auto it = rt->begin(), end = rt->end(); it != end; ++it)
    {
        // *it is the current capture group; the first one is the entire match

        std::cout << "   Match[" << std::distance(rt->begin(), it) << "]: " << *it << ", length " << it->length() << std::endl;
    }
}

不要忘记处理ns::regex_error类型的异常。

答案 1 :(得分:0)

通过引用传递res而不是按值传递。换句话说,将参数res声明为引用而不是值,即type &res,而不是type res