LINUX.ORG.RU

C++: выделить часть строки от символа до символа

 , ,


0

1

Пытаюсь вычленить из имеющейся строки сабж.
Строка - std::string. Нужно ее вырезать от первого пробела до второго. Пока единственное, что придумал, это прогон std::string.substr() в цикле, пока не попадется второй пробел.
А есть ли еще варианты решения?

★★★★★

Ответ на: комментарий от hateyoufeel

Регэкспы

Не подойдут - не умею в регулярки.

boost

Тяжеловесно, но по-любому проект их потребует... подойдет.

std::string::find

что возвращает?

DeadEye ★★★★★
() автор топика

regex match
даже пример под рукой есть

#include <string>
#include <regex>
#include <iostream>


int main() {
	std::string title = "Success state=7SpaJQKB9YxXkw63k96ki7PEH7dDA83Q&code=4/-tsm0fDPYwyL_c4hm-sPiVZs7EJk - Google Chrome";
	std::string SuccessRegexPattern = ".*Success state=([^\\s]+)\\&code=([^\\s]+).*";
	std::string code;
	std::string state;
	std::regex successRegex(SuccessRegexPattern, std::regex::ECMAScript);

	std::smatch match;
	bool res = std::regex_match(title, match, successRegex);
	std::cout << "match result " << res << "\n";
	std::cout << "match size " << match.size() << "\n";
	if (match.size() > 2)
	{
		state = match[1];
		code = match[2];
		std::cout << state << "\n";
		std::cout << code << "\n";
	}
	else
		std::cout << "no match\n";
	return 0;
}

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
firstSpace=s.find_first_of(" ");
secondSpace=s.find_first_of(" ",firstSpace+1);
fromSpaceToSpace=s.substr(s,firstSpace,secondSpace-firstSpace);

это сразу после сытного ужина, в С-шном стиле.. породите из этого класс, добавьте исключений и будет ок

MKuznetsov ★★★★★
()

Ещё можешь извратиться как с сишной строкой в цикле (но итераторы лучше). Ты лучшее напиши, зачем тебе нужны другие варианты?

peregrine ★★★★★
()

Ну раз уж буст советуют:

QString::fromStdString(str).split(" ").at(1).toStdString();

fluorite ★★★★★
()
Последнее исправление: fluorite (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

Кажись, оно! Большое спасибо.

DeadEye ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

Все, кто советуют регекспы - убейте себя. Дожили, блин.

+

Тебе нужен простейший конченый автомат.

Не находишь противоречия? :)

invy ★★★★★
()
Ответ на: комментарий от Pavval

А чем собсна тебя регэксы не устраивают?

invy ★★★★★
()
Ответ на: комментарий от invy

Нет, не нахожу. Регекспы хоть и являются языком для сокращенной записи КА, но здесь явно оверкилл. Флажок-переменная состояния, простой цикл, блок условий.

Варианты с файндами лично я сам не приемлю, даже для таких случаев.

yoghurt ★★★★★
()
Ответ на: комментарий от invy

Регекспы нужны когда парсим что-то очень сложное, т.к. работают они довольно медленно. Если писать парсер веб-странички, то да, регекспы нужны и имеют полное право на жизнь. Если пишем простую фигню, то регекспы - оверхед.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Если писать парсер веб-странички, то да, регекспы нужны и имеют полное право на жизнь.
парсер веб-странички,
регекспы

тут должна быть ссылка на знаменитый пост про парсинг HTML регэкспами на stackoverflow

comp00 ★★★★
()
Последнее исправление: comp00 (всего исправлений: 1)
Ответ на: комментарий от just-a-joke

Ни в коем случае. Ибо это не единственный нормальный ЛОРовец.

DeadEye ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

Флажок-переменная состояния, простой цикл, блок условий.

Зачем эти велосипеды, когда уже есть инструмент, при том универсальный.

invy ★★★★★
()
Ответ на: комментарий от peregrine

Если что, то всё надо применять с умом без крайностей.

Экак ты отмазываешься: один раз не ....

comp00 ★★★★
()

Для std::string - find, уже показали, еще можно сразу взять qtcore и там:

QString::section( ' ', 1, 2 );
anonymous
()
Ответ на: комментарий от peregrine

т.к. работают они довольно медленно

4.2, ибо зависит от выбранной имплементации
написание своих цикликов-с флагами вместо использования регэкспов - экономия на спичках и трата времени.
Ещё веселее будет, если сегодя были пробелы, а завтра станут ещё какие-то хитрые конструкции.

invy ★★★★★
()
Ответ на: комментарий от DeadEye

Можно и без boost

 
#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
int main(int argc, char **argv){  
    std::string text="Как разбить разбить строку по пробелам";
    std::replace(text.begin(), text.end(), '.', ' ');
    std::istringstream is(text);
    std::string word;
    while (is >> word) std::cerr<<word<<std::endl;
    return 0;
}

comp00 ★★★★
()
Ответ на: комментарий от peregrine

Что-то сложное - регекспами? Лооол, это фиаско.

yoghurt ★★★★★
()
Ответ на: комментарий от invy

Соревноваться будем? Перчатку бросить? :) Кто быстрее распарсит 100-метровый файл, КА в 3 строчки на плюсах, или регексп на плюсах.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Вот моя перчатка, написанная в лоб. Заменяет все пробельные разделители (' ', '\t') на символ " — ". Пробелы в начале строки и в конце строки разделителями полей не считаются.

#include <stdio.h>

#define SEP " -- "

enum State {Init, Space, Data};

int main (int argc, char *argv[]) {
   (void) argc;
   (void) argv;

   char c = 0;
   State s = Init;

   while ((c = fgetc(stdin)) != EOF) {
      switch (c) {
      case ' ':
      case '\t': if (s == Data) s = Space; break;
      case '\n': fputc(c, stdout); s = Init; break;
      default:   if (s == Space) fputs(SEP, stdout); fputc(c, stdout); s = Data; break;
      }
   }
   return 0;
}
dm@debian:~/devel/tmp$ time cat large.txt | ./a.out >> /dev/null 

real	0m3.283s
user	0m3.256s
sys	0m0.136s

Входной файл - 83 конкатенации «Улисс» Джойса (видимо, мой стандартный пример для тестов уже), весом в 127 Мб.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

с icc

dm@debian:~/devel/tmp$ time cat large.txt | ./a.out >> /dev/null                    

real    0m3.014s
user    0m2.980s
sys     0m0.128s

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

while ((c = fgetc(stdin)) != EOF) {

Ха, ну тут даже тягаться нет смысла, ибо regex с потоком не дружит :)

invy ★★★★★
()
Ответ на: комментарий от yoghurt

так вариантов куча было предложено. Я бы в цикле прогнал. Ну или find.

comp00 ★★★★
()
23 сентября 2016 г.
Ответ на: комментарий от Pavval

Неплохо работает когда правило гибкое и нужно его например через флаг передавать в бинарь, который на продакшне без прохождения через процесс релизов

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

Stl-строки уже научились в utf-8?

А в STL есть std::string::substr, и что?

А midRef?

wolph ★★
()
Ответ на: комментарий от vertexua

посоны, расходимся, это некропостинг!

/me сам накололся…

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.