2012-11-05 184 views
2

假設我想用C++ 11正則表達式提取匹配大括號的內容。因此,例如,{foo}會匹配成功,我可以使用match_result來提取內容。這看似簡單,但下面的代碼並不完全做什麼,我希望C++正則表達式匹配大括號內的內容

std::string foo("{foo}"); 
std::regex r("\\{(.*)\\}"); 
std::smatch m; 
bool result = regex_match(foo, m, r); // result returns true 

cout << m[0] << endl; // prints: {foo} 
cout << m[1] << endl; // prints: {foo} instead of just foo as I would expect 

現在不應該m[1]回報只是foo沒有括號因爲它是第一個捕獲組?

編輯:這個問題的一個重要信息是,我使用的編譯器是GCC 4.6.3(它目前是Ubuntu 12.04 LTS中的最新版本庫)。答案確切地說明了GCC對正則表達式的支持有多差。

+0

注意,如果你是一個gcc的用戶,大多都的正則表達式的東西尚未實現。 – inf

+1

編譯器/標準庫?大多數編譯器/標準庫,包括gcc/libstdC++還沒有完全實現正則表達式支持。 – Artyom

回答

3

您的模式是正確的。你的代碼在很大程度上是正確的,在這裏和那裏缺少'std''('cout','endl'和regex_match),或者至少不一致(假設你使用名字空間標準)。

此外,在Visual Studio 2012上,您的代碼輸出預期結果。我沒有嘗試2010年,但我懷疑它也在那裏運行(微軟在2010年併入了TR1)。

我懷疑你使用的是gcc。正如@Artyom指出的,在gcc/libstdC++中沒有實現。它編譯好沒有警告,但它給出了錯誤的結果。儘管人們普遍認爲海灣合作委員會在各個領域都優於微軟,但正則表達式並非如此。正則表達式的海合會

查找狀態這裏: http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x

+0

你絕對正確。 GCC仍然對'std :: regex'支持不好。不幸的是,在這種情況下,所有的東西都可以毫無錯誤地編譯出來。我想我現在需要轉換爲正則表達式的boost。 –

+0

Microsoft在2008年添加了TR1,作爲VC++ 2008 SP1的一個功能包前體(然後合併到所述服務包中)。 – ildjarn

+0

5年圖層g ++ v4.8是Ubuntu 14上的默認g ++版本,對未來幾年有長期支持。顯然,正則表達式編譯但不起作用。哎呀。有關v4.8正則表達式支持的限制,請參閱https://stackoverflow.com/a/12665408/2950621。 – nmgeek

相關問題