2014-10-28 69 views
0

我想從"[self hello];""self""hello"的標記大小...我做錯了什麼? (MSVC++)正則表達式新手的東西

#include <iostream> 
#include <regex> 
#include <string> 

using namespace std; 

int main() { 
    string s = "[self hello];"; 
    string x1 = R"raw(\[(\w+)\s+(\w+)\]\;)raw"; 
    regex re(x1); 

    sregex_token_iterator it(s.begin(),s.end(),re,-1); 
    sregex_token_iterator reg_end; 
    for (; it != reg_end; ++it) 
    { 
     auto a = *it; 
     std::cout << a; // doesn't work. Displays empty string. 
    } 
} 
+0

正則表達式是不是在GCC全面實施後,我聽到了。 – 2014-10-28 22:25:35

+0

不是GCC,Visual Studio MSVC++。 – Michael 2014-10-28 22:26:15

+2

你應該在你的問題中清楚地說明這一點,因爲它有所作爲。 – 2014-10-28 22:26:39

回答

2

您已給出iterator constructor的特殊值-1。這意味着它應該提供無與倫比的部分。但是,您的整個字符串是匹配的。你可以看到這個有效果,如果你做只匹配字符串(live example)的一部分:

string s = "abc[self hello];def"; 

輸出:

ABC
高清

或者,您可以添加(live example):

string s = "abc[self hello];def[beep boop];ghi"; 

輸出:

ABC
DEF
GHI

下面是使用相同的字符串作爲第一示例值和輸出的其他一些對:

0或左out:[自我打招呼];
1:自
2:你好

+0

在這種情況下,我應該避免一個for循環並創建一個interator構造函數2次,其中一個值爲1,另一個值爲2以獲得結果,是嗎? – Michael 2014-10-28 22:41:16

+0

@Michael,你可能會喜歡'std :: regex_match'。有一個例子[這裏](http://en.cppreference.com/w/cpp/regex/regex_match)。我相信你也可以爲'std :: sregex_token_iterator'提供一個要使用的索引列表(la's.begin(),s.end(),re,{1,2}')。實際上我幾乎沒有在C++中使用任何正則表達式,所以我不知道這樣做的標準方法是什麼。 – chris 2014-10-28 22:46:45