Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
weboman
210 / 195 / 63
Регистрация: 13.08.2010
Сообщений: 1,531
Записей в блоге: 6
1

Как разбить строку на строки?

24.08.2010, 14:43. Показов 8593. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
допустим дана строка
myStrk:='раз два три четыре пять (231) 5:20 шесть семь 10:30 восемь девять 20:00 десять';

должно получиться

Delphi
1
2
3
4
5
6
myStrkOut[1]:='5:20'; 
myStrkOut[2]:='шесть семь'; 
myStrkOut[3]:='10:30'; 
myStrkOut[4]:='восемь девять'; 
myStrkOut[5]:='20:00'; 
myStrkOut[6]:='десять';
как видно я "раз два три четыре пять" отбросил, оно мне не нужно, нужно поместить в строки только тот текст, который идет вот после этого символа ")".
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2010, 14:43
Ответы с готовыми решениями:

Как разбить строку по разделителям с переносом строки
У меня есть набор разделителей (,:;.) и надо в него добавить символ или обозначение переноса...

Разбить строку на отдельные строки
Нужен код , который будет разбивать введённую строку на отдельные строки до точки Пример: ...

Разбить длинную строку на строки?
Есть очень длинная сплошная строка в файле .txt. Нужно разбить ее на сроки по n символов, то есть...

Разбить строку по символу переноса строки
Код ниже разбивает строку по символу переноса строки с помощью std::getline #include <algorithm>...

17
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,162
Записей в блоге: 24
24.08.2010, 16:15 2
Это по какому критерию разбивается?
0
weboman
210 / 195 / 63
Регистрация: 13.08.2010
Сообщений: 1,531
Записей в блоге: 6
24.08.2010, 16:19  [ТС] 3
в смысле по какому критерию???
{ все то что до символа ")" удалить, включая сам символ ")", остальное повставлять в отдельные строки, часы (это у меня время 20:30) в отдельную строку, текст, после времени в отдельную }
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
24.08.2010, 19:24 4
разбивка по пробелам после ')'
Delphi
1
2
3
4
5
6
7
8
9
10
11
sLen := Length(src) + 1;
bPos := Pos(')', src);
ePos := bPos + 1;
bPos := ePos;
while ePos <= sLen do begin
  if src[ePos] in [#0, ' '] then begin
    AddStr(Copy(src, bPos, ePos - bPos));
    bPos := ePos + 1;
  end;
  Inc(ePos);
end;
0
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
24.08.2010, 20:56 5
вот как-то так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
uses RegExp, ...
...
procedure TForm1.Button1Click(Sender: TObject);
var s:string; i,j:integer; r:tRegExpr;
begin
r:=tRegExpr.Create;
s:=Edit1.Text;
j:=pos(')',s);
if j>0 then s:=copy(s,j+1,length(s)-j);
r.Expression:='([\s]*)([\d]+:[\d]+){1}\s([^\d]+)';
Memo1.Lines.Clear;
s:=r.Replace(s,#13+#10+'$2'+#13+#10+'$3',true);
Memo1.Lines.Add(s);
Memo1.Lines.Delete(0);
r.Free;
end;
...
пример прилагается
Вложения
Тип файла: zip RegExpExmple.zip (221.2 Кб, 95 просмотров)
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
24.08.2010, 21:05 6
Или по простому. Между временем может быть любой текст.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TForm1.Button1Click(Sender: TObject);
var s,s1:string;
    i:integer;
begin
s:='раз два три четыре пять (231) 5:20 шесть семь 10:30 восемь девять 20:00 десять';
delete(s,1,pos(')',s)+1);
s:=s+' '; //добавим пробел
while length(s)>0 do
 begin
  if s[1] in ['0'..'9'] then //если первая цифра
   begin
    Memo1.Lines.Add(copy(s,1,pos(' ',s)-1)); /берем до пробела
    delete(s,1,pos(' ',s)); //удаляем с пробелом
   end
 else  //если не цифра
  begin
   s1:='';
   i:=1;
   while (not(s[i] in ['0'..'9']))and(i<=length(s)) do
    begin
     s1:=s1+s[i];//составляем текст
     i:=i+1;
    end;
   Memo1.Lines.Add(copy(s1,1,length(s1)-1)); //отбросим пробел в конце
   delete(s,1,length(s1)); //удаляем
  end;
 end;
 end;
0
weboman
210 / 195 / 63
Регистрация: 13.08.2010
Сообщений: 1,531
Записей в блоге: 6
25.08.2010, 12:06  [ТС] 7
В том то и дело что не по пробелам критерий, пробелов в такой строке может и не быть:
myStrk:='раз два три четыре пять (231) 5:20шесть семь10:30восемь девять20:00десять';
вот такая каша, а тут все начали по пробелам производить расчеты??? эх. видно не судьба.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
25.08.2010, 12:12 8
Цитата Сообщение от AlienNation Посмотреть сообщение
а тут все начали по пробелам производить расчеты??
Так ты и приводи точное условие, как написал, так я и сделал. Потом напишешь что вообще текст на китайском, а разделители водяные знаки...
0
weboman
210 / 195 / 63
Регистрация: 13.08.2010
Сообщений: 1,531
Записей в блоге: 6
25.08.2010, 12:15  [ТС] 9
ну видимо теперь мне прийдется этот же вопрос перезадавать
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
25.08.2010, 12:17 10
ну видимо теперь мне прийдется этот же вопрос перезадавать
Я тебе перезадам. Пиши в этой теме точное задание с примером реального исходного текста и для чего это нужно, как и в чем должен быть результат.
0
weboman
210 / 195 / 63
Регистрация: 13.08.2010
Сообщений: 1,531
Записей в блоге: 6
25.08.2010, 12:53  [ТС] 11
хм, все не так просто, моя прога заходит на сайт и считывает оттуда инфу (ТВ программу), которая заноситься в Edit, выглядить в Edit это примерно так: 140 ICTVОбсудить(62)06:00Служба розыска детей06:05Погода06:10Факты06:25Деловые факты06:35300 сек/час06:40Погода06:45Свитанок07:40Деловые факты
все в одну строку, вот это и надо разбить на строки. я не знаю целесообразно ли будет код выкладывать, лучше прикреплю архив (+инструкция)tvMSG.rar
0
weboman
210 / 195 / 63
Регистрация: 13.08.2010
Сообщений: 1,531
Записей в блоге: 6
25.08.2010, 12:55  [ТС] 12
хм, все не так просто, моя прога заходит на сайт и считывает оттуда инфу (ТВ программу), которая заноситься в Edit, выглядить в Edit это примерно так: 140 ICTVОбсудить(62)06:00Служба розыска детей06:05Погода06:10Факты06:25Деловые факты06:35300 сек/час06:40Погода06:45Свитанок07:40Деловые факты
все в одну строку, вот это и надо разбить на строки. я не знаю целесообразно ли будет код выкладывать, лучше прикреплю архив (+инструкция)tvMSG.rar
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
25.08.2010, 13:08 13
Ну тогда ищешь символ ':', и работаешь с ним.
0
weboman
210 / 195 / 63
Регистрация: 13.08.2010
Сообщений: 1,531
Записей в блоге: 6
25.08.2010, 13:10  [ТС] 14
Я наверно таки задам теперь этот вопрос точнее, хорошо?
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
26.08.2010, 10:12 15
AlienNation, предлагаю такое решение:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//Пример строки для обработки: aStr = 140 ICTVОбсудить(62)06:00Служба розыска детей06:05Погода06:10Факты06:25Деловые факты06:35300
//Получим: aList:
(*
140 ICTVОбсудить(62)
06:00
Служба розыска детей
06:05
Погода
06:10
Факты
06:25
Деловые факты
06:35
300
*)
procedure SplitStr(const aStr : String; aList : TStrings);
const
  D = ['0'..'9'];
  StrTempl = '00:00';
var
  i, j, k, Len1, Len2, LenTempl, Pos1, Pos2 : Integer;
begin
  Len1 := Length(aStr);
  LenTempl := Length(StrTempl);
  Len2 := Len1 - LenTempl + 1;
 
  Pos1 := 1;
  Pos2 := 0;
  i := 1;
  while i <= Len2 do begin
    //Сравнение с шаблоном.
    k := i;
    for j := 1 to LenTempl do begin
      case StrTempl[j] of
        '0' : if not ( aStr[k] in D ) then Break;
        else if aStr[k] <> StrTempl[j] then Break;
      end;
      Inc(k);
    end;
    //Если найдено совпадение с шаблоном.
    if j > LenTempl then begin
      //Записываем в список текст описания.
      Pos2 := i - 1;
      if Pos1 <= Pos2 then begin
        aList.Add( Copy(aStr, Pos1, Pos2 - Pos1 + 1) );
      end;
      //Записываем в список текст, соответствующий шаблону.
      aList.Add( Copy(aStr, i, LenTempl) );
      //Перемещаем позицию правее шаблона.
      Inc(i, LenTempl);
      Pos1 := i;
    //Если шаблон не совпал.
    end else begin
      //Смещаем позицию на 1 символ вправо.
      Inc(i);
    end;
  end;
 
  //Записываем в список оставшийся текст описания.
  if Pos1 <= Len1 then begin
    aList.Add( Copy(aStr, Pos1, Len1 - Pos1 + 1) );
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  SplitStr(Memo1.Text, Memo2.Lines);
end;
В этом примере на форму надо положить 2 Мемо и одну кнопку. Если в Мемо1 ввести текст:
140 ICTVОбсудить(62)06:00Служба розыска детей06:05Погода06:10Факты06:25Деловые факты06:35300
то при нажатии на кнопку, в Мемо2 получим:
140 ICTVОбсудить(62)
06:00
Служба розыска детей
06:05
Погода
06:10
Факты
06:25
Деловые факты
06:35
300
---
Если в начальном тексте надо отсекать часть до первого символа ')', то обработчик нажатия кнопки можно оформить так:
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button1Click(Sender: TObject);
var
  Pos1 : Integer;
  Str1 : String;
begin
  Str1 := Memo1.Text;
  Pos1 := Pos(')', Str1);
  if Pos1 > 0 then Delete(Str1, 1, Pos1);
  SplitStr(Str1, Memo2.Lines);
end;
1
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
26.08.2010, 13:44 16
Да уж, вот людям делать нечего - понаписали кучу процедур, сразу видно - трушные кодеры

А надо-то было - всего лишь заменить одну строчку в моем примере:
Delphi
1
r.Expression:='([\s]*)([\d]+:[\d]+){1}\s([^\d]+)';
на
Delphi
1
r.Expression:='([\s]*)([\d]+:[\d][\d])[\s]*(.*?)';
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.08.2010, 13:56 17
Цитата Сообщение от Markus_13 Посмотреть сообщение
сразу видно - трушные кодеры
Markus_13, Не хами и на карточку не обижайся, заслужил...
0
Markus_13
26.08.2010, 14:26     Как разбить строку на строки?
  #18

Не по теме:

Цитата Сообщение от Puporev
Не хами
О дааа, какое оскорбление серьезное, такое смывается только кровью)))
Цитата Сообщение от Puporev
на карточку не обижайся
Я не обидчивый))

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2010, 14:26

Разбить строку на две строки: гласные и согласные
Мне нужно что бы вы мне ребят помогли написать програмку в Паскале.В заранее большое спасибо ! ...

Как разбить строку через Split по переносам на новую строку?
У меня есть строка (string file), которая выглядит так, как на фото. Как её разбить по переносам на...

Разбить строку на слова - Нулевая длина строки char*
Добрый день! Пытаюсь в цикле считать из файла, содержащего такую строку &quot;fga b qwee&quot;, так, чтобы...

Preg_split разбить строку оставляя в качестве строки арифметические знаки +,-,*,/ и тд
Разбить строку, где разделителями служат арифметические знаки оказалось довольно легко. А вот...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru