2016-01-20 20 views
1

我正打算使用下面的正則表達式來捕獲文件的路徑和名稱:正則表達式的Visual Studio

std::regex capture_path_name_file("(.+)\\([^\\]+)\\.[^\\]+$"); 

但在運行時(我使用的Visual Studio)我得到的正則表達式錯誤

error_brack: the expression contained mismatched [ and ] 

設法找出原因我想下面的正則表達式:

std::regex test("[^\\]") 

,我得到了同樣的錯誤。

我過我的正則表達式中regex101.com(有細微的差別,我不得不使用\.代替\\.

感謝您的幫助。

+2

在C++語法中,''[^ \\]「'表示'[^ \]',它在正則表達式中是不匹配的[']。如果你的意思是創建一個'不反斜槓'的字符類,你必須爲C++和一次正則表達式轉義一次,即'[^ \\\\'''。 – Biffen

+0

這是爲PHP,但也應該回答你的問題:http://stackoverflow.com/a/14783396/4181011 –

+1

請參閱[本演示](https://ideone.com/UpArVo)。 –

回答

1

您遇到的問題是因爲\\被視爲常規字符串文字中的1個文字\符號。 Biffenhis comment中解釋得很好,[^\\]被視爲[^\]]被視爲字面],而不是關閉字符類定界符(並且沒有匹配]以進一步關閉字符類)。

正確的答案是:使用_splitpath_s

如果你想進一步用正則表達式玩,你能解決這個問題是這樣的:

#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 
    std::regex rex1(R"((.+?)([^\\.]+\.[^\\.]+)$)"); 
    std::smatch m; 
    std::string str = "c:\\Python27\\REGEX\\test_regex.py"; 
    if (regex_search(str, m, rex1)) { 
     std::cout << "Path: " << m[1] << std::endl; 
     std::cout << "File name: " << m[2] << std::endl; 
    } 
    return 0; 
} 

使用原始字符串字面量,可以避開大部分涉及到逃逸的問題。使用R"((.+?)([^\\.]+\.[^\\.]+)$)",它將匹配並捕獲到組1中的文件夾路徑,並且它將捕獲到組2中具有擴展名的文件名。請注意,擴展名必須存在。

+0

我強烈主張'_splitpath_s'不是一個好的解決方案,而是遍歷['std :: tr2 :: path']的實例(https://msdn.microsoft.com/en-us/library /hh874769%28v=vs.120%29.aspx)(VC++ 2015中的'std :: experimental :: path')。 – ildjarn

相關問題