2009-11-25 55 views
2

我正在使用C++ VS 2008去除RTF標記以僅在RTF文本中進行搜索。通過正則表達式崩潰來清除RTF標記

我從CRichTextEditCString的RTF文本工作得很好。 我這裏如何儘量去除標籤:

std::tr1::cmatch res; 
std::string str = note; 
const std::tr1::regex rx("({\\)(.+?)(})|(\\)(.+?)(\b)"); 
std::string replacement = ""; 
std::string result = std::tr1::regex_replace(str,rx,replacement); 

CString strSearchText = result.c_str(); 

線上面的圖案3個崩潰。一個簡單的文本替換模式工作得很好:Ex用"fast fox"用emplty字符串替換"fast"。飛機墜毀的消息是在這裏:在ICView的std :: TR1 :: regex_error內存位置0x0012ee20 ..
第一次機會異常在0x7622fbae:在0x7622fbae在ICView.exe

第一次機會異常:微軟C++異常.EXE:微軟C++異常:[重新拋出]在存儲器位置00000000 ..
在0x7622fbae在ICView.exe未處理的異常:微軟C++異常:性病:: TR1在存儲器位置0x0012ee20 :: regex_error ..

+0

困難(如果不是不可能)解析正則表達式的標記語言已經獲得了很多。最近關注Stack Overflow。我對RTF不夠熟悉,認爲同樣的問題也適用,但似乎很可能。 – pavium 2009-11-25 01:33:28

回答

0

你需要跳過你的反斜槓,因爲它們在正則表達式和C++ string lite中都可以作爲轉義字符RALS。這意味着要匹配單個反斜槓,需要四個反斜槓字符。我認爲這應該工作:"({\\\\)(.+?)(})|(\\\\)(.+?)(\\b)"

這應該修復異常,但如果它仍然發生,你可以捕獲它並使用異常對象的what()或code()方法來查看問題是什麼。

編輯:大括號也應該逃脫,因爲它們是正則表達式中的特殊字符。所以使用:

"(\\{\\\\)(.+?)(\\})|(\\\\)(.+?)(\\b)" 
+0

你完全正確地指出反斜槓作爲逃逸字符 - 謝謝我會改變它們。 但問題不在於沒有正確地用新模式替換我的字符串,而是在我聲明rx模式的第3行崩潰。 std :: tr1 :: regex_error被拋出,指向錯誤的內存定位等。如果我聲明const std :: tr1 :: regex rx(「brown fox」);它會像魅力一樣工作。什麼是錯的? – val 2009-11-25 16:28:55

+0

反斜槓是什麼錯誤。他們導致偏食,從而導致無與倫比的偏見錯誤。 – interjay 2009-11-25 16:47:53

+0

夥計們,萬分感謝。因爲這是大括號,必須已在正則表達式中逃脫!我愚蠢地忘了那些#$#$#$#@@ 乾杯和快樂編碼, Val :-) – val 2009-11-25 22:28:27

0

使用異常處理,如果你沒有對模式在未來控制

std::tr1::regex pattern; 
bool bError = false; 
try 
{ 
    pattern.assign("*som.thing"); 
} 
catch (std::regex_error error) 
{ 
    bError = true; 
}