2015-07-21 47 views
0

我試圖讓我的代碼在OS X和Linux上工作都一樣。 下面的代碼與編譯的clang++ --std=c++11 regextest.cppC++(C++ 11)在OS X和Linux上的正則表達式差異

#include <regex> 
#include <iostream> 
int main() 
{ 
    std::string str = "/api/asd/"; 
    std::string pattern = "/api/(.*)/"; 
    std::cout << "Starting matching" << std::endl; 
    std::smatch matches; 
    if (std::regex_match(str, matches, std::regex(pattern, std::regex::egrep))) 
    { 
     std::cout << "Found match!" << std::endl; 
     std::cout << "All matches: "; 
     for (auto& it : matches) 
      std::cout << it << ", "; 
     std::cout << std::endl; 
    } 
    return 0; 
} 

在OS X,運行該代碼的結果是:

Starting matching 
Found match! 
All matches: /api/asd/, asd, 

在Linux中,在另一方面(Gentoo的,的libstdC++ 3.3)

Starting matching 
Found match! 
All matches: /api/asd/, /asd/, // 

它與Linux上的/api/相匹配?爲什麼?

此外,試圖用一個模式像/api/([^/])在Linux的完全失敗,匹配什麼,但還有在OS X

我試過匹配類型的多種組合,(基本,擴展的grep,egrep的作品, awk)與轉義和未轉義的()(取決於匹配類型),沒有在Linux上產生預期的結果。

+0

看起來你的編譯器在Linux上有問題。嘗試使用GCC,並確保其更新。 – Havenard

+3

g ++ - 4.9附帶的libstdC++版本是第一個支持''的,請參閱https://stackoverflow.com/a/12665408/241631。我的猜測是你使用的是舊版本。 – Praetorian

+0

您是否嘗試過使用'std :: regex :: ECMAScript'而不是'std :: regex :: egrep'?我不確定egrep正則表達式的特性是什麼,但ECMAScript應該可以正常工作。 – Havenard

回答

1

正如評論所建議的,這個問題是通過將gcc升級到4.9來解決的。 (目前需要在Gentoo上執行〜amd64標誌)。