2010-03-02 130 views
1

我遇到了tr1 :: regex(VS2008)的一個非常奇怪的問題,我找不出原因。爲什麼這個正則表達式模式(tr1 :: regex)異常?

微軟C++異常::在執行期間到達第四正則表達式定義當在柱的端部的代碼編譯很好,但會引發異常的std :: TR1在存儲器位置0x0012f5f4 :: regex_error ..

但是,我能看到的唯一區別(也許我是盲人)在第三和第四個之間是'NumberOfComponents'而不是'SchemeVersion'。起初我想也許兩個(第三和第四)都是錯誤的,第三個錯誤只是在第四個觸發。這似乎並非如此,因爲我移動了它們並在它們之間放置了多個其他正則表達式定義。有問題的行總是觸發異常。

沒有人有任何想法,爲什麼這條線

std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}");

觸發異常,但

std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}");

不?運行時是否只是搞亂了我?

感謝您閱讀本文並感謝您的寶貴意見。
牛逼

PS:我是完全確定的解決方案是很容易我打我的頭靠在最近的牆壁,甚至出了「愚蠢的問題」因果報應......


#include <regex> 

int main(void) 
{ 
    std::tr1::regex rxSepFileIdent("Scanner Separation Configuration"); 
    std::tr1::regex rxScannerNameIdent("\\ScannerName:((\\s*\\w+)+)"); 

    std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}"); 
    std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}"); 

    std::tr1::regex rxConfigStartIdent("Configuration Start"); 
    std::tr1::regex rxConfigEndIdent("Configuration End"); 

    return 0; 
} 
+0

如果將rxSchemeVersion行更改爲「NumberOfComponents」,會發生什麼情況? – 2010-03-02 02:41:49

+0

'std :: tr1 :: regex_error'是相當通用的。什麼是錯誤代碼(捕獲異常爲(例如)'rerr'並打印'rerr.code()')?將結果與'std :: tr1 :: regex_constants :: error_type'常量(http://msdn.microsoft.com/en-us/library/bb982845(lightweight).aspx)進行比較以找出錯誤(s)你正在處理。 – outis 2010-03-02 02:42:39

回答

2

您需要雙重逃避你的反斜槓 - 一次爲正則表達式本身,第二次爲他們的字符串。

以S開頭的那個工作,因爲\S是一個有效的正則表達式轉義(非空白字符)。以N開頭的那個不會(因爲\N不是有效的正則表達式轉義)。使用"\\\\SchemeVersion:等等。

+0

感謝大家的快速回復(特別是Dav和Vlad)... 我要繼續前進,並在我的小臥室裏留下一個凹痕,以便問......:D – Tobias 2010-03-02 02:50:20

相關問題