С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1

Разбитие строки на части

15.01.2013, 13:09. Показов 2786. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня.Подскажите что почитать можно про разбитие строки на на части
До субботу не будет компьютера, хоть информацию почитать
Задача такова , имеется строка такого вида
Code
1
Дима:Привет:122:11/1111/1:Один:ДВа:0102030405060708091011121314 #Первая строка
Мне нужно разбить эту строку на строки:

Первая строка
Дима
Привет
122
Один
Два
0102030405060708091011121314

Как это реализовать, и с помощи чего?
Я думал с помощью регулярных выражений RegExpr
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2013, 13:09
Ответы с готовыми решениями:

Разбитие времени на составные части
Здраствуйте, возник вопрос по разбитию реального времени на составные его части, на минуты/секунды/часы/дни/месяцы/год, как отдельные...

Разбитие строки
Есть строка, которая передаётся в функцию func(code); Содержимое строки выглядит в подобном виде: set 10 mix true real 15

Разбитие строки на символы
Как преобразовать строку в массив символов? Заранее спасибо

28
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
15.01.2013, 13:21
C++
1
2
3
4
5
6
7
8
9
10
 AnsiString stroka="Äèìà:Ïðèâåò:122:11/1111/1:Îäèí:Äâà:0102030405060708091011121314 #Ïåðâàÿ ñòðîêà";
 int r=stroka.Pos("#");
 AnsiString nach=stroka.SubString(r+1, stroka.Length()-r+1);
 AnsiString kon=stroka.SubString(0, r-1);
 Memo1->Lines->Add(nach);
 TStringList *list = new TStringList;
 list->Delimiter=':';
 list->DelimitedText=kon;
 Memo1->Lines->AddStrings(list);
 delete list;
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.01.2013, 13:30  [ТС]
mimicria, Ух ты, как быстро!!!!!)))Спасибо огромное
Только как вот это удалять :11/1111/1:
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
15.01.2013, 13:34
Цитата Сообщение от Ddv122 Посмотреть сообщение
Только как вот это удалять :11/1111/1:
C++
1
Memo1->Lines->Delete(4);
при условии, что Memo до добавления было Clear()
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.01.2013, 13:39  [ТС]
mimicria, а если сразу много строк обрабатываю, то с указание номера может не работать...
Может тогда возможно каждую строку занести в переменную, при обработке? больше 6 строк точно не будет, просто к каждой строке в начало текста мне нужно добавлять ещё информацию
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
15.01.2013, 13:56
Да какая разница. Не нравится в мемо, удаляйте прямо в списке, он всё равно каждый раз для строки пересоздаётся
C++
1
2
3
4
5
6
7
8
9
10
11
AnsiString stroka="Дима:Привет:122:11/1111/1:Один:Два:0102030405060708091011121314 #Первая строка";
 int r=stroka.Pos("#");
 AnsiString nach=stroka.SubString(r+1, stroka.Length()-r+1);
 AnsiString kon=stroka.SubString(0, r-1);
 Memo1->Lines->Add(nach);
 TStringList *list = new TStringList;
 list->Delimiter=':';
 list->DelimitedText=kon;
 list->Delete(3);
 Memo1->Lines->AddStrings(list);
 delete list;
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.01.2013, 14:11  [ТС]
mimicria, Спасибо огромное)
Только остается как то к строкам в Стринг Листе добавить нужную инфу.
К примеру строка №2. нужно в начале строки добавить слово НУ
, что бы вышло Ну Привет
Это возможно сделать?
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
15.01.2013, 14:15
Цитата Сообщение от Ddv122 Посмотреть сообщение
что бы вышло Ну Привет
C++
1
 list->Strings[1]="Íó "+ list->Strings[1];
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.01.2013, 14:43  [ТС]
Лучший ответ Сообщение было отмечено как решение

Решение

mimicria, спасибо огромное еще раз, все работает
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.01.2013, 17:07
Через https://www.cyberforum.ru/post3437417.html
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
17.01.2013, 14:12  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  TStringList *list = new TStringList;
  AnsiString stroka;
for( int i=0; i<mmo1->Lines->Count;i++ )
{
    if (!mmo1->Lines->Strings[i].IsEmpty())  
    stroka=mmo1->Lines->Strings[i];
 int r=stroka.Pos("#");
 AnsiString nach=stroka.SubString(r+1, stroka.Length()-r+1);
 AnsiString kon=stroka.SubString(0, r-1);
 Memo2->Lines->Add(nach);
 list->Delimiter=':';
 list->DelimitedText=kon;
 list->Delete(3);
 Memo1->Lines->AddStrings(list);
}
 delete list;}
Скажите где ошибка в цикле, если есть пустая строка, то всё дублируется...
В mmo1
Code
1
2
3
Дима:Привет:122:11/1111/1:Один:Два:0102030405060708091011121314 #Первая строка
 
Дима:Привет:122:11/1111/1:Один:Два:0102030405060708091011121314 #Третья строка
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.01.2013, 14:57
Если строка непустая, тогда берем ее в обработку. А если пустая? Тогда ты берешь в обработку предыдущую строку, так как stroka содержит предыдущую строчку мемо и не очищается каждый цикл.
В принципе ее и очищать-то ни к чему:
C++
1
if ( mmo1->Lines->Strings[i].IsEmpty( )  ) continue;
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
17.01.2013, 15:42  [ТС]
Спасибо, а ещё такой вопрос как исключить строки мне не подходящие?
К примеру
Code
1
2
3
4
Дима:Привет:122:11/1111/1:Один:Два:0102030405060708091011121314 #Первая строка
 1222
Дима:Привет:122:11/1111/1:Один:Два:0102030405060708091011121314 #Третья строка
#111 строка
При обработке будет ошибка...list index of bounds
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.01.2013, 15:50
Тебя интересует строго определенный формат строки; возможно, несколько форматов, не суть. Следовательно, удобнее всего будут регулярки. Продолжать изощряться с помощью Pos и SubString, сдается мне, смысла нет - нужно более гибкое и легко расширяемое решение.
На досуге вспомню и накидаю, если Avazart не опередит, он их тоже шибко любит...
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
17.01.2013, 15:59  [ТС]
BRcr, а может будет ешё проще, строки нужно обрабатывать 2 видов...они всё одинаковы, но в начале может быть Дима или Маша, другие не нужны...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.01.2013, 02:00
Вот на регулярках:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <boost/regex.hpp>
 
void __fastcall TForm1::btn1Click( TObject *Sender )
{
    using namespace boost;
 
    wregex pattern( L"(\\w+):(\\w+):(\\d+):\\d*/\\d*/\\d*:(\\w+):(\\w+):(\\d+) #(\\w+ \\w+)" );
 
    for ( size_t i = 0, l_count = memo_in->Lines->Count; i < l_count; ++i ) {
        wcmatch parts;
        if ( regex_match( memo_in->Lines->Strings[i].c_str( ), parts, pattern ) ) {
            memo_out->Lines->Add( parts[parts.size( ) - 1].str( ).c_str( ) );
            for ( size_t i = 1, parts_size = parts.size( ) - 1; i < parts_size; ++i ) {
                memo_out->Lines->Add( parts[i].str( ).c_str( ) );
            }
            memo_out->Lines->Add( "" );
        }
    }
}
Только я чего-то запарился, как очищать cmatch, поэтому в теле цикла его пересоздаю... если не очищать, то на втором поиске белиберду выдает всякую. Хотя, в консоли нормально работает...

Если билдер не юникодный, просто используй соответственно regex и cmatch.
Миниатюры
Разбитие строки на части  
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
18.01.2013, 15:01  [ТС]
BRcr, У меня С++ Builder 6...
<boost/regex.hpp> регулярки он не поддерживает.
Только если использовать Делфивской RegExpr
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.01.2013, 15:39
Цитата Сообщение от Ddv122 Посмотреть сообщение
Только если использовать Делфивской RegExpr
Почему бы и нет? Сам я, правда, с этой штукой не работал, но сильно отличаться ведь не должно...
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
18.01.2013, 16:19  [ТС]
Что то вроде такого
C++
1
2
3
4
5
AnsiString InputStr = str;
    TRegExpr* RegExp=new TRegExpr();
    RegExp->Expression="<[^>]*?>/*";
    RegExp->Compile();
    InputStr=RegExp->Replace(str,"",false);
Добавлено через 39 минут
C++
1
2
3
4
5
6
7
8
9
10
    TRegExpr* RegExp=new TRegExpr();
    AnsiString str;
    AnsiString InputStr = str;
    for( int i=0; i<mmo1->Lines->Count;i++ )
{
    str=mmo1->Lines->Strings[i];
    RegExp->Expression="(\\w+):(\\w+):(\\d+):\\d*/\\d*/\\d*:(\\w+):(\\w+):(\\d+) #(\\w+ \\w+)";
    RegExp->Compile();
    InputStr=RegExp->Replace(str,"",false);
    Memo2->Lines->Add(InputStr);
Не подскажите в чём дело...Компилируется, но не работает
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.01.2013, 16:39
А чего делает Replace() ?

Гляну, может, на XE этот TRegExpr тоже есть...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2013, 16:39
Помогаю со студенческими работами здесь

Разбитие строки через DelimitedText
Несколько дней тому назад я наткнулся на следующий код TStringList *source = new TStringList; source-&gt;Delimiter = ','; ...

xml разбитие на 3 части
Всем привет! Я, считываю с xml файла строку, и необходимо разбить ее на 3 части, и вывести каждую часть в отдельный txtBox. ...

Разбитие кода на отдельные части
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;ctime&gt; int sec(0); int minu(0); int chas(0); int B = 1; int...

Разбитие синусоидального сигнала на части
Здравствуйте,столкнулся с такой проблемой : мне требуется разбить сигнал на несколько частей по типу : с 0 до 51 элемента,с 51 элемента до...

Загрузка изображения и разбитие на части
У меня есть &quot;пазл&quot;, там изображение берется из указанного пути, т.е. в корне лежит какое-либо изображение, оно загружается и разбивается на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru