Форум программистов, компьютерный форум CyberForum.ru

regex - C++

Восстановить пароль Регистрация
 
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
29.09.2013, 19:11     regex #1
как через регулярки подсчитать количество слов в стоке???
я пробовал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iterator>
#include <iostream>
#include <string>
#include <regex>
 
using namespace std;
 
void main() {
   string temp = " qwe    sdfv       23 rewref 3132 rwreffe ";
   regex reg ("\\w+");
   smatch sm;
   regex_search (temp, sm, reg);
   cout << sm.size() << endl << endl;
 
   for (int i = 0; i < sm.size(); ++i)
      cout << sm[i] << endl;
 
   system("pause");
}
выдает только "qwe". хотя на сайте проверки регулярок, такая все слова находит. где я накосячил???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 19:11     regex
Посмотрите здесь:

C++ std::regex и boost::regex
C++ Регулярные выражения (regex)
C++ <regex> гайд
Regex в char C++
C++ [C++11] regex constructor исключение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.09.2013, 19:14     regex #2
mat_for_c,
Returns true if a match exists, false otherwise.
Когда найдено первое соответствие поиск закончится.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
29.09.2013, 19:15  [ТС]     regex #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Когда найдено первое соответствие поиск закончится.
Ок. А как тогда сделать???
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.09.2013, 19:16     regex #4
для начала надо решить задачу выделения первого слова в строке
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
29.09.2013, 19:18  [ТС]     regex #5
regex_match вообще ничего не находит...

Добавлено через 1 минуту
Цитата Сообщение от XRuZzz Посмотреть сообщение
для начала надо решить задачу выделения первого слова в строке
по сути она уже решена...
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.09.2013, 19:23     regex #6
как тогда найти пробел после слова? какой символ в регулярках ищет все пробельные символы(tab и прочее).
какой символ используется для поиска границы слова?

Добавлено через 3 минуты
мне вот самому интересно можно ли сделать оптимальнее, чем каждый раз по регулярке искать следующее слово используя regex_search в цикле.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
29.09.2013, 19:33  [ТС]     regex #7
я вот чего не понимаю. почему regex_match выдает 0??? в то время как search хоть что-то находит... что за шаманство???
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.09.2013, 19:37     regex #8
Цитата Сообщение от mat_for_c Посмотреть сообщение
regex_match
так а какое описание у regex_match?
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
29.09.2013, 19:52  [ТС]     regex #9
Цитата Сообщение от XRuZzz Посмотреть сообщение
так а какое описание у regex_match?
true if rgx is matched against the target sequence. false otherwise.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.09.2013, 20:07     regex #10
для этого скорее всего нужно, чтоб вся строка соответвала регулярному выражению, а у вас там не только буквы.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
29.09.2013, 20:19  [ТС]     regex #11
Цитата Сообщение от XRuZzz Посмотреть сообщение
для этого скорее всего нужно, чтоб вся строка соответвала регулярному выражению, а у вас там не только буквы.
ага... наконец-то разобрался, вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <regex>
 
using namespace std;
 
void main() {
 
   string temp = " qwe    sdfv       23 rewref 3132 rwreffe ";
   regex reg ("\\w+");
   smatch sm;
   int c = 0;
   while (regex_search(temp, sm, reg)) {
      ++c;
      temp = sm.suffix(); //сокращаем строку !!! о как!
   }
   cout << c << endl << endl;
 
   system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 20:46     regex
Еще ссылки по теме:

C++ regex с русскими символами
Regex в С++ C++
C++ <regex> выборка из массива

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
29.09.2013, 20:46     regex #12
Так подойдет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <boost/regex.hpp>
 
int main()
{
   std::string temp = "qwe    sdfv       23 rewref 3132 rwreffe";
   boost::regex reg("\\w+");
   boost::sregex_iterator start(temp.begin(), temp.end(), reg);
   size_t countOfWords = 0;
   while(start != boost::sregex_iterator())
   {
      *start++;
      ++countOfWords;
   }
   std::cout << countOfWords << std::endl;
 
   std::cout << "\nDone." << std::endl;
   return 0;
}
Yandex
Объявления
29.09.2013, 20:46     regex
Ответ Создать тему
Опции темы

Текущее время: 16:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru