2015-10-26 39 views
0

我是一名經驗豐富的C++開發人員,但對STL相對較新。我以前的任何項目都沒有使用過STL。我嘗試使用正則表達式來解析Windows服務文件(Windows\System32\drivers\etc\services),並且我的表達式在Notepad ++中正常工作(在刪除爲C字符串文字添加的加倍反斜槓之後),但是我的STL代碼無法匹配相同的表達式,文本。我已經調試過它,並且我能說的最好,我認爲它匹配[e-Za-z]的「e」,然後未能匹配「c」到[^] *可能是因爲它沒有看到範圍爲否定。我通過STL正則表達式代碼中的_N_if節點,然後_N_rep節點因爲(在調用堆棧中嵌套了更深層次的幾個級別)而失敗,它正在處理_N_class節點。 _Node=>_Flags值爲_Fl_final(4),其中不包含_Fl_negate(1)標誌。STL regex_match無法匹配^。*

在這裏,我想,是我想調試的基本代碼:

std::basic_regex<TCHAR> re(_T("^([A-Za-z][^ ]*)\\s+(\\d{1,5})\\/(tcp|udp)\\b.*"), std::regex_constants::ECMAScript); 
//... 
std::match_results<const TCHAR*> mr; 
if (std::regex_match(szLine, mr, re)) 

相信szLine的內容是

echo    7/tcp 

它看起來像「E」被匹配,如果我的調試技巧很好,那麼「c」就會失敗。

我使用Visual Studio 2013年

編輯: szLine以換行符結束。我想知道這是否會導致比賽失敗,因爲.默認不符合換行符?

+0

什麼編譯器/版本您使用的? – NathanOliver

+0

Visual Studio 2013,只是通過編輯添加到問題中。 – BlueMonkMN

+0

我運行了你提供的示例,沒有使用新行,但在將新行添加到'szLine'後,它沒有。我在正則表達式中添加了'\\ n?',現在它在兩種情況下都能正常工作。 – AKJ88

回答

0

使用regex_match時必須記住匹配必須適用於整個字符串,包括換行符(如果存在)。記住.與默認情況下不匹配換行符,這裏的答案是將\\n?添加到C字符串文字的末尾,這會解析爲\n?進入模式,該模式與字符串末尾的可選換行符相匹配。

0

爲了匹配包括換行符的任何符號,可以使用[\s\S](或[\d\D]或甚至[\w\W])字符類。

此外,您的正則表達式不匹配您提供的字符串,因爲沒有第二個\d+。這裏是一個示例代碼,將與regex_match工作:

string line = "echo    7/tcp\n"; // <-- \n is added 
string regexStr = "^([A-Za-z][^ ]*)\\s+(\\d{1,5})/(tcp|udp)\\b[\\s\\S]*"; 
//               ^^^^^^^^^  
regex rg(regexStr); 
smatch sm; 
if (regex_match(line, sm, rg)) { 
     std::cout << sm[1] << std::endl; 
     std::cout << sm[2] << std::endl; 
     std::cout << sm[3] << std::endl; 
    } 

IDEONE demo

結果是:

echo 
7 
tcp 
+0

實際上,我提供的正則表達式和字符串除了添加\ n以外沒有其他更改。示例字符串中只有一位數字。 – BlueMonkMN

+0

對不起,我女兒一定在鍵盤上輸入了一些東西,而我正在喂她:) –