我正在使用带有 -std=c++0x 的 gcc 4.6.3
这是我第一次使用 std::regex。而且我看不到我的错误:
- 输入解析的 std::string 以
GET/favicon.ico HTTP/1.1
开头,而我的正则表达式模式是GET(.*)
。 - 结果组 1 被评估为
T/favicon.ico HTTP/1.1
而我期望更像/favicon.ico HTTP/1.1
我不明白为什么要保留 T
?
这是我的代码:
static const std::string strRegExp="GET(.*)";
std::string computeRequestedItem(const std::string& strHttpRequest)
{
std::cout << "SEARCHING :" << strRegExp << "in :" << strHttpRequest;
std::string strResult;
std::match_results<std::string::const_iterator> result;
static const std::regex pattern(strRegExp);
bool bValid = std::regex_match(strHttpRequest, result, pattern);
if(!bValid)
{
std::cout << "error" << std::endl;
return strResult;
}
strResult = result[1];
std::cout << "Requested item: " << strResult << std::endl;
return strResult;
}
这是输出:
SEARCHING :GET(.*)in :GET /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
-+-+-+-+-+-+-+-+-+-+-+-+-+
Requested item: T /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
最佳答案
libstdc++ 正则表达式支持只是部分的。请see here并阅读 28 Regular Expression
。我相信您拥有的代码应该可以正常工作。作为测试,我将 std
更改为 boost
并使用 boost::regex 编译了您的代码,并按照您的预期获得了以下结果:
Requested item: /favicon.ico HTTP/1.1
我建议使用 boost::regex
直到 libstdc++ regex 得到完全支持。
关于c++ - 我在这个使用 std::regex 的正则表达式中犯了什么错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504296/