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

В каждой второй строке удалить третье слово, если такое есть - C++

Восстановить пароль Регистрация
 
Fox_s
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 6
25.01.2014, 18:34     В каждой второй строке удалить третье слово, если такое есть #1
Добрый день! Ребята срочно нужна помощь,буду признателен,нужно в С++ разработать программу следующего условия:

В каждой второй строке надо удалить третье слово, если такое есть,
при этом количество пробелов в строке не должно измениться.
Остальные строки не меняются.

Заранее благодарен, Борис!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 18:34     В каждой второй строке удалить третье слово, если такое есть
Посмотрите здесь:

C++ Скопировать содержимое текстового файла, удалив в каждой строке слово номер N+1, если в слове N есть 4
C++ Как из первой строки удалить те буквы, которые есть во второй строке?
C++ С++ Удалить в каждой строке последнее слово
C++ Найти слово "ТЕКСТ", если такое слово есть,то отпечатать его номер в строке.
В предложении удалить первое вхождение “w”, если такое есть C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
26.01.2014, 01:56     В каждой второй строке удалить третье слово, если такое есть #2
Легко решить можно с помощью регурярных выражений и boost. Например, удаление 3 слова в строке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/regex.hpp>
 
int main()
{
   std::string str = "first second third fourth ";
 
   const boost::regex reg("\\s*(\\<.*?\\>\\s+){2}(\\<.*?\\>)");
   boost::smatch match;
   if (boost::regex_search(str.cbegin(), str.cend(), match, reg))
   {
      //for (auto& i : match) std::cout << i << "\n";
      if (match.size() == 3)
         boost::algorithm::erase_first(str, match[2].str());
   }
   std::cout << str << "\n";
 
   return 0;
}
Это не сложно будет переделать под решение полной задачи, - нужно будет всего лиши разбить требуемый текст на строки и пройтись по нему в цикле работая с каждым третим элементом. А без буста все это писать надо будет очень долго и нудно.

Не по теме:

Кликните здесь для просмотра всего текста
Вопрос не по теме, по регулярному выражению - почему данный ниже код бросает иключение? - хотел сделать lookbehind (?<=) в регулярке, что то типа этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include <boost/algorithm/string/regex.hpp>
#include <boost/regex.hpp>
 
int main()
{
   std::string str = "first second third fourth ";
 
   const boost::regex reg("(?<=\\s*(\\<.*?\\>\\s+){2})(\\<.*?\\>)");
   boost::algorithm::erase_regex(str, reg);
   std::cout << str << "\n";
 
   return 0;
}

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 13:00     В каждой второй строке удалить третье слово, если такое есть #3
Цитата Сообщение от DiffEreD Посмотреть сообщение
Это не сложно будет переделать под решение полной задачи, - нужно будет всего лиши разбить требуемый текст на строки и пройтись по нему в цикле работая с каждым третим элементом. А без буста все это писать надо будет очень долго и нудно.
Буст устанавливать компилировать нада, лучше из stl <regex> использовать никакой либы подключать не нужно заголовок добавил #include <regex> и все юзай РВ. С помощью <regex> за 5 минут делается.

Добавлено через 2 минуты
А от рв что б на предложения разбить примерно такое"(?:\\s|[^\\.!\\?])+?\\.|!|\\?"
KOPOJI
26.01.2014, 13:01
  #4

Не по теме:

Цитата Сообщение от DiffEreD Посмотреть сообщение
Вопрос не по теме
заглядывать назад в PCRE позволяется только на определенное количество символов, а \s* и т.д. - неопределенное.

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.01.2014, 13:11     В каждой второй строке удалить третье слово, если такое есть #5
Цитата Сообщение от KOPOJI Посмотреть сообщение
заглядывать назад в PCRE позволяется только на определенное количество символов, а \s* и т.д. - неопределенное.
а в <regex> РВ не PCRE, а ECMAscript РВ (javascript РВ).
KOPOJI
Модератор
 Аватар для KOPOJI
16239 / 6450 / 389
Регистрация: 12.06.2012
Сообщений: 19,325
26.01.2014, 13:31     В каждой второй строке удалить третье слово, если такое есть #6
ninja2, PCRE = Perl-Compatible Regular Expressions. Перевод нужен, или достаточно? У него boost. Ну и, если уж так хочется что-нибудь написать - то можно сначала полистать мануал
http://www.boost.org/doc/libs/1_55_0...ex/syntax.html
There are three main syntax options available, depending upon how you construct the regular expression object:
Perl (this is the default behavior).
POSIX extended (including the egrep and awk variations).
POSIX Basic (including the grep and emacs variations).
Добавлено через 6 минут
ninja2, и да, в дополнение, по поводу ECMAScript http://www.ecma-international.org/ec...5.1/#sec-15.10
A RegExp object contains a regular expression and the associated flags.

NOTE The form and functionality of regular expressions is modelled after the regular expression facility in the Perl 5 programming language.
Yandex
Объявления
26.01.2014, 13:31     В каждой второй строке удалить третье слово, если такое есть
Ответ Создать тему
Опции темы

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