2015-11-09 42 views
0

讓我們假設我有這樣的字符串:String1/String2/String3/String4C++ 11正則表達式 - 找出兩個斜線字符之間的所有比賽

我想使用正則表達式來找到斜槓字符之間的每一個匹配的最後一個字符/ +後一切。所以輸出是:String2 , String3 , String4

smatch match_str; 
regex re_str("\\/(.*)"); 

regex_match(s, match_str, re_str); 

cout << match_str[1] << endl; 
cout << match_str[2] << endl; 
cout << match_str[3] << endl; 
+0

aaaaaand你的問題是什麼? –

+0

嘿托馬斯:),忘了解釋我寫的代碼不起作用。 – atari83

回答

1

注意regex_match需要一個完整的字符串匹配。此外,.*儘可能匹配除換行符以外的0個或更多字符(即,它匹配到給定行的最後)。

此外,/在C++正則表達式中的符號不​​需要轉義。

這裏是一個工作代碼:

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

int main() { 
    std::regex r("[^/]+"); 
    std::smatch m; 
    std::string s = "String1/String2/String3/String4"; 

    for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); 
          i != std::sregex_iterator(); 
          ++i) 
    { 
     std::smatch m = *i; 
     std::cout << m[0] << '\n'; 
    } 
    return 0; 
} 

IDEONE demo

結果:

String1 
String2 
String3 
String4 

如果需要指定初始邊界,使用

std::regex rex1("(?:^|/)([^/]+)"); 

那麼值將在m[1]之內,而不是在m[0]之內。見another demo

+0

非常感謝!爲解釋和示例代碼;) – atari83

+0

'regex_search'不會破壞任何東西,請使用迭代器。 – sln

+0

不,它不會,但是這行'str_copy = m.suffix()。str();'will。 –

0

您可以使用此一:

\\/([^\\/])* 

隨着live example

+0

感謝您的回覆,它只是沒有爲我工作 – atari83

+0

匹配結果前有一個額外的'/' – atari83

+0

@ atari83現在應該是好的 –

0

下面是一個使用方式字符串迭代器(未經測試)來做到這一點。

std::string strInput = "String1/String2/String3/String4"; 

std::string::const_iterator start = strInput.begin(); 
std::string::const_iterator end = strInput.end(); 
std::smatch _M; 

std::regex Rx("/([^/]*)"); 

while (regex_search(start, end, _M, Rx)) 
{ 
    std::string strSubDir = _M[1].str();  // Do something with subdir 
    cout << strSubDir.c_str() << endl;  // Debug print subdir 
    start = _M[0].second;      // Advance the start iterator past this match 
} 

輸出:

String2 
String3 
String4 
相關問題