2013-07-25 66 views
3

我在boost::regex行爲中遇到了與字符串中的\r\n字符匹配時的問題。我通信通過串口與我的Linux C++應用程序中的調制解調器和我從它收到以下消息如何在使用boost :: regex時指定回車符和換行符匹配?

ATI3\r\nv3.244\r\nOK\r\n 

我知道,這個字符串是正確的,因爲我實際檢查返回的每個字符的ASCII十六進制值。問題是我的應用程序需要去掉由vX.XYZ部分字符串指定的版本號。爲此我使用的是基於以下boost::regex代碼:

string str_modem_fw_version_number = ""; 
string str_regex("ATI3\r\nv(\d+[.]\d+)\r\nOK\r\n"); 
boost::regex patt; 
try 
{ 
     patt.assign(str_regex); 
     boost::cmatch what; 
     if (boost::regex_match(str_reply.c_str(), sc_what, patt)) { 
      str_modem_fw_version_number = string(sc_what[1].first,sc_what[1].second); 
     } 
} 
catch (const boost::regex_error& e) 
{ 
    cout << e.what() << endl; 
} 

以上不工作 - 我可以看到字符串我回來是正確的,但我相信我做一些明顯的錯誤與CR和NL正則表達式中的字符。 我也試過不上一個主題工作

string str_regex("ATI3.*(\d+[.]\d+).*"); 
string str_regex("ATI3\\r\\nv(\d+[.]\d+)\\r\\nOK\\r\\n"); 

和變化以下,但我覺得我必須缺少如何boost::regex對待NL和CR字符的一些基本信息。我已經瀏覽了boost文檔頁面,但沒有成功,所以我在嘗試使用替代方法來解決問題之前作爲最後的手段。

+0

你看看http://stackoverflow.com/questions/7740435/regex-matching-eol-character-within-a-string – alexbuisson

回答

3

試着用這個來代替:

string str_regex("ATI3\r\nv(\\d+[.]\\d+)\r\nOK\r\n"); 

注意的\d\轉義成爲\\d

對兩個備用正則表達式應用相同的更改也應使這些工作。

說明

這不是換行或回車匹配的問題,而是與escape sequences in string literals\d不是一個字符串的有效轉義序列 - 事實上,我的編譯器警告我一下:

warning: unknown escape sequence: '\d' [enabled by default] 

它是由升壓::正則表達式認可[:digit:]的快捷方式。爲了讓boost :: regex庫''看到'\,它需要被轉義。

+0

非常感謝先生!現在就像魅力一樣。 – mathematician1975

相關問題