C ++ Regex для соответствия слов без знаков препинания - PullRequest
5 голосов
/ 28 января 2011

Я искал, не мог ничего найти.Чтобы не тратить больше моего времени на шанс, что ответ очевиден для кого-то другого, я спрашиваю здесь.Единственный сайт, который был полезен до сих пор, это: http://softwareramblings.com/2008/07/regular-expressions-in-c.html, но примеры слишком упрощены.Я использую Visual studio 2010.

#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;
}

Ожидаемый результат будет:

Некоторые
слова
И
некоторые
пунктуация

Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 января 2011

Несколько вещей здесь.

Во-первых, вашей строке регулярных выражений необходимо экранировать \. В конце концов, это все еще строка 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";
}
1 голос
/ 28 января 2011

Попробуйте это:

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;
}
...