Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

НУжно разобрать выражение *.gif;*.jpg;*.html;*.php; и т.д.


Кокандокало ©   (2002-12-16 14:42:00) 

Подскажите пожалуйста, мастера, есть ли в дельфях какой-нить стринг токенайзер?
Нужно разобрать строку с типами файлов... и вытащить конкретные значения в TStringList
т.е. *.gif;*.jpg;*.html;*.php; превратить в
gif
jpg
html
php


Юрий Зотов   (2002-12-16 23:06:00) [1]

> Кокандокало (16.12.02 21:11)
> Дык в том то и дело, что метод Song"a превращает string в
> string, а не string в TStringList...

Батенька, а дела-то плохи... Справочку по TStrings поcмотреть не помешало бы...


Song   (2002-12-16 21:25:00) [2]

ай-ай-ай...
Надо перед Delete поставить "System.", а то он не тот delete будет иметь ввиду :)


Song   (2002-12-16 21:19:00) [3]

2Кокандокало (16.12.02 21:11)
Почему не стринглист? Это смотря как применять.. я же не зря свойство Text-то написал, думал вы догадаетесь..

Var Str:TStringList;
S:String;

Str:= TStringList.Create;
With Str Do
try
S:="*.gif;*.jpg;*.html;*.php;";
S:=StringReplace(S,";*.",#13#10,[rfReplaceAll]);
Delete(S,1,2);
Delete(S,Length(S),1);
Text:=S;
ShowMessage(Text);
finally
Str.Free;
end;


Кокандокало   (2002-12-16 21:11:00) [4]

Дык в том то и дело, что метод Song"a превращает string в string, а не string в TStringList... Ну ладно.. извините.. просто хотел убедится, что в дельфи аппрарат по обработке строк бействительно скуден.. Нет тебе никаких токенайзеров...
Эээх..
Всем спасибо..

2id_privin: спасибо.. поищу, попробую..


Song   (2002-12-16 20:07:00) [5]

И действительно :)
Ну, кстати я ещё забыл, что нужно первые 2 символа стереть :) - <*.>


Юрий Зотов   (2002-12-16 18:53:00) [6]

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

См. самый первый ответ - Song © (16.12.02 14:45). О чем еще после этого нужно дискутировать, непонятно.


id_privin   (2002-12-16 17:47:00) [7]

Есть неплохой, правда не безглючный класс. Называется TRegExpr.
Ищеться яндексом. Решает большинство проблем. Правда иногда очень медлено (посравнению с перлом).


Nikolay M.   (2002-12-16 17:11:00) [8]

В RX есть прекрасная функция ExtractDelimited. Если RX под рукой нет, вот, выдрал:

function ExtractDelimited(N: Integer; const S: string;
const Delims: TCharSet): string;
var
CurWord: Integer;
I, Len, SLen: Integer;
begin
CurWord := 0;
I := 1;
Len := 0;
SLen := Length(S);
SetLength(Result, 0);
while (I <= SLen) and (CurWord <> N) do begin
if S[I] in Delims then Inc(CurWord)
else begin
if CurWord = N - 1 then begin
Inc(Len);
SetLength(Result, Len);
Result[Len] := S[I];
end;
end;
Inc(I);
end;
end;


asmith   (2002-12-16 15:53:00) [9]

var
lst : TStringList;
...
lst := TStringList.Create();
lst.Delimiter := ";";
lst.DelimitedText := "*.gif;*.jpg;*.html;*.php;";
for i := 0 to lst.Items.Count - 1 do
strToken := lst[i];
...



Calm   (2002-12-16 15:06:00) [10]

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


Кокандокало   (2002-12-16 15:03:00) [11]

а как? ты предлагаешь посимвольно разбирать строку? А точно другого способа нет?


Song   (2002-12-16 14:45:00) [12]

Ну дык Text:=StringReplace(Text,";*.",#13#10,[rfReplaceAll]); и последний символ потом стереть..


Calm   (2002-12-16 14:45:00) [13]

Стандартного нет.
Но ведь проще задачи не бывает.
Проходишь от начала строки до конца и выделяешь слова. Значащием символы - латинские буквы, разделители - пробел, *,;.
В чем проблема?


Наверх

Титульная страница Поиск, карта сайта Написать письмо