2014-10-28 109 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