0
我試圖讓我的代碼在OS X和Linux上工作都一樣。 下面的代碼與編譯的clang++ --std=c++11 regextest.cpp
C++(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上產生預期的結果。
看起來你的編譯器在Linux上有問題。嘗試使用GCC,並確保其更新。 – Havenard
g ++ - 4.9附帶的libstdC++版本是第一個支持''的,請參閱https://stackoverflow.com/a/12665408/241631。我的猜測是你使用的是舊版本。 –
Praetorian
您是否嘗試過使用'std :: regex :: ECMAScript'而不是'std :: regex :: egrep'?我不確定egrep正則表達式的特性是什麼,但ECMAScript應該可以正常工作。 – Havenard