2014-01-28 41 views
2

我想匹配所有具有擴展名的文件.nef - 匹配必須不區分大小寫。如何創建不區分大小寫的正則表達式來匹配文件擴展名?

regex e("(.*)(\\.NEF)",ECMAScript|icase); 
... 
if (regex_match (fn1, e)){ 
    //Do Something 
} 

這裏fn1是一個帶有文件名的字符串。

但是,這隻對.NEF(大寫)擴展名的文件「有所作爲」。 .nef擴展名被忽略。

我也嘗試 -

regex e("(.*)(\\.[Nn][Ee][Ff])"); 

regex e("(.*)(\\.[N|n][E|e][F|f])"); 

這兩者導致運行時錯誤。

g++ nefread.cpp -o nefread -lraw_r -lpthread -pthread -std=c++11 -O3 

我在做什麼錯 -

terminate called after throwing an instance of 'std::regex_error' 
    what(): regex_error 
Aborted (core dumped) 

我的代碼是用匯編?這是我的基本代碼。我想擴展它以匹配更多的文件擴展名.nef,.raw,.cr2,

+2

這個例外可能不會有什麼,與你的正則表達式的字符串,但它是因爲你使用gcc的正則表達式的實現,這是壞了。海灣合作委員會將在4.9版中發佈工作'' – Praetorian

+0

爲什麼你會嘗試匹配「。」與「\\。」?它不應該是「\」嗎? –

+0

@Praetorian - 哦!所以這些http://cpprocks.com/wp-content/uploads/c++11-regex-cheatsheet.pdf中的一些不起作用? –

回答

5

您的原始表達是正確的,並應產生所需的結果。問題在於gcc實現了<regex>,這被破壞了。 This answer解釋了爲什麼如此的歷史原因,並且還表示gcc4.9將附帶工作<regex>實現。

你的代碼工作使用Boost.Regex

#include <iostream> 
#include <string> 
#include <boost/regex.hpp> 

int main() 
{ 
    // Simple regular expression matching 
    boost::regex expr(R"((.*)\.(nef))", boost::regex_constants::ECMAScript | 
             boost::regex_constants::icase); 
    //    ^^^   ^^ 
    // no need escape the '\' if you use raw string literals 
    boost::cmatch m; 

    for (auto const& fname : {"foo.nef", "bar.NeF", "baz.NEF"}) { 
     if(boost::regex_match(fname, m, expr)) { 
      std::cout << "matched: " << m[0] << '\n'; 
      std::cout << "   " << m[1] << '\n'; 
      std::cout << "   " << m[2] << '\n'; 
     } 
    } 
} 

Live demo

+0

謝謝。我想我會使用boost實現((| | N)(E | e)(F | f))|((C | c))(我們使用正則表達式e (R | r)2))「,ECMAScript | icase);' - 'icase'沒用,根據需要匹配'.nef'和'.cr2'。 –

+1

這應該有效,但你真的不用如果你使用'icase'標誌,那麼你不需要使用可怕的表達式。'regex expr(R「dlm((。*)\。(nef | cr2))dlm」,ECMAScript | icase);'結果。 – Praetorian

相關問題