2012-08-23 60 views
2

我想解析字符串解析字符串的boost ::精神phrase_parse

std::string entry = "127.0.0.1 - [16/Aug/2012:01:50:02 +0000] \"GET /check.htm HTTP/1.1\" 200 17 \"AgentName/0.1 libwww-perl/5.833\"" 

與如下:

ip_rule %= lexeme[(+char_("0-9."))[ref(ip) = _1]]; 
    timestamp_rule %= lexeme[('[' >> +(char_ - ']') >> ']')[ref(timestamp) = _1]]; 
    user_rule %= lexeme[(+char_)[ref(user) = _1]]; 
    request_rule %= lexeme[('"' >> +(char_ - '"') >> '"')[ref(req) = _1]]; 
    referer_rule %= lexeme[('"' >> +(char_ - '"') >> '"')[ref(referer) = _1]]; 

    bool r = phrase_parse(first, last, 
    ip_rule >> user_rule >> timestamp_rule >> request_rule >> uint_[ref(status) = _1] 
    >> uint_[ref(transferred_bytes) = _1] >> referer_rule, space); 

,但它不匹配。如果我從字符串中刪除了「 - 」,當然還有規則「user_rule」,而不是匹配。您能否建議如何將字符串與「 - 」匹配?

+0

規則具有以下類型: 規則<迭代器,的std :: string(),空間類型> ip_rule,timestamp_rule,user_rule,request_rule,referer_rule; – bayerb

回答

3

user_rule「吃」一文的其餘部分。定義它是這樣的:+~qi::char_("[")),這樣它會停止在'['字符。 下面的代碼按預期方式工作:

#include <boost/spirit/include/qi.hpp> 
using namespace boost::spirit::qi; 

int main() 
{ 
    std::string ip, user, timestamp, req, referer; 
    unsigned status, transferred_bytes; 
    std::string entry = "127.0.0.1 - [16/Aug/2012:01:50:02 +0000] \"GET /check.htm HTTP/1.1\" 200 17 \"AgentName/0.1 libwww-perl/5.833\""; 
    bool r = phrase_parse(entry.begin(), entry.end(), 
    lexeme[+char_("0-9.")] >> 
     +~char_("[") >> 
     lexeme[('[' >> +~char_("]") >> ']')] >> 
     lexeme[('"' >> +~char_("\"") >> '"')] >> 
     uint_ >> 
     uint_ >> 
     lexeme[('"' >> +~char_("\"") >> '"')], space, ip, user, timestamp, req, status, transferred_bytes, referer); 

} 
+0

其實我的目標是能夠改變不同規則的順序。這是來自訪問日誌的條目,因此序列可以根據webservers配置的logformat指令進行更改。如何用激勵精神來解決它? – bayerb

+0

@ user777377我不確定我是否收到了您的問題,以及它與原始問題的關係 - 您能舉一個例子嗎?如果只是另一個,請另寫一個問題。 –

+0

例如:std :: string1 ='127.0.0.1 - [16/Aug/2012:01:50:02 +0000]'; std :: string2 ='127.0.0.1 [16/Aug/2012:01:50:02 +0000] - '; – bayerb

相關問題