2011-01-28 197 views
4

我搜索了,找不到任何东西。为了不浪费我更多的时间来回答对其他人显而易见的问题,我在这里问。目前为止唯一有用的网站是:http://softwareramblings.com/2008/07/regular-expressions-in-c.html,但样本太简单了。我使用Visual Studio 2010中C++正则表达式匹配无标点符号

#include <regex> 

[...] 

string seq = "Some words. And... some punctuation."; 
regex rgx("\w"); 

smatch result; 
regex_search(seq, result, rgx); 

for(size_t i=0; i<result.size(); ++i){ 
    cout << result[i] << endl; 
} 

预计产出将是:

一些


一些
标点符号

感谢。

+0

我不怪你没有得到这个权利。我在这方面看到的文档很难实现。 – 2011-01-28 06:46:08

回答

3

有几件事情在这里。

首先,你的正则表达式字符串需要有\转义。毕竟,它仍然是一个C++字符串。

regex rgx("\\w"); 

此外,正则表达式\w只匹配一个“单词字符”。如果你想匹配整个单词,你需要使用:

regex rgx("\\w+"); 

最后,为了通过所有可能的匹配迭代,那么你需要使用一个迭代器。这是一个完整的工作示例:

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

int main() 
{ 
    string seq = "Some words. And... some punctuation."; 
    regex rgx("\\w+"); 

    for(sregex_iterator it(seq.begin(), seq.end(), rgx), it_end; it != it_end; ++it) 
     cout << (*it)[0] << "\n"; 
} 
+0

我完全忘记了仍然需要逃离字符串。其他答案张贴工作,我需要的唯一的补充是它忽略任何单词只有数字。 – Chris 2011-01-28 07:00:40

1

试试这个:

string seq = "Some words. And... some punctuation."; 
regex rgx("(\\w+)"); 

regex_iterator<string::iterator> it(seq.begin(), seq.end(), rgx); 
regex_iterator<string::iterator> end; 

for (; it != end; ++it) 
{ 
    cout << it->str() << endl; 
} 
+0

这工作得很好。 – Chris 2011-01-28 07:00:59