![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Каким образом можно разбить эту строку на подстроки... [D6, Win2k, WinXP]
georgys © (2002-12-26 15:15:00)Я начинающий программист и вот такой вопрос родился.
Есть вот такая строка сформированная прокси сервером.
192.168.99.254 - oleg [23/Dec/2002:21:15:12 +0300] "GET http://counter.rambler.ru/top100.cnt?294098HTTP/1.0" 200 936
Как ее разбить на составляющие?
smok_er (2002-12-26 16:45:00) [1]а не проще ли воспользоваться регэкспрами?
georgys (2002-12-26 16:15:00) [2]Спасибо всем большое. У меня уже получилось. Только вот теперь придется каким то образом выдерать ненужные символы.
georgys (2002-12-26 16:07:00) [3]Спасибо всем большое. У меня уже получилось. Только вот теперь придется каким то образом выдерать ненужные символы.
Skier (2002-12-26 16:06:00) [4]TTriada = packed record
tFirstPart : String;
tSecondPart : String;
tThirdPart : String;
end;
//...................
procedure TForm1.Button3Click(Sender: TObject);
function SplitStr(const AStrToSplit : String) : TTriada;
var
AHTTPPos : Integer;
ii : Integer;
begin
FillChar(Result, SizeOf(TTriada), 0);
if AStrToSplit = EmptyStr then Exit;
AHTTPPos := Pos("http:", AStrToSplit);
if AHTTPPos = 0 then Exit;
ii := AHTTPPos;
while AStrToSplit[ii] <> " " do begin
Result.tSecondPart := Result.tSecondPart + AStrToSplit[ii];
Inc(ii);
end; //while
Result.tFirstPart := Copy(AStrToSplit, 1, AHTTPPos - 1);
Result.tThirdPart := Copy(AStrToSplit, ii, Length(AStrToSplit));
end;
var
ATriada : TTriada;
begin
ATriada := SplitStr("192.168.99.254 - oleg [23/Dec/2002:21:15:12 +0300] "GET http://counter.rambler.ru/top100.cnt?294098HTTP/1.0" 200 936");
WriteLn(ATriada.tFirstPart);
WriteLn(ATriada.tSecondPart);
WriteLn(ATriada.tThirdPart);
end;
Anatoly Podgoretsky (2002-12-26 15:51:00) [5]georgys © (26.12.02 15:35)
У тебя цикл от 1 до 1, и уже неважно, что у тебя внутри цикла
И тут нельзя искать по пробелу, не все пробелы в данной структуре являются разделителями, есть еще и [] и "..."
georgys (2002-12-26 15:49:00) [6]Ага. Понял. Попробую. Спасибо.
Reindeer Moss Eater (2002-12-26 15:44:00) [7]Имеем строку.
Находим первый пробел слева.
Копируем все что левее пробела в переменную
Удаляем все с начала строки до позиции пробела, включая и его самого.
Начинаем все сначала, не забыв вовремя остановиться
georgys (2002-12-26 15:41:00) [8]Так. Но каким же тогда образом мне все это разделить на подстроки и распихать по массивам? Я так понял, что WrapText() мне не подойдет, он же только вместо чего то вставляет другое чего то. А смысл?
Reindeer Moss Eater (2002-12-26 15:37:00) [9]Потому что два параметра у него: что искать и где. Какое по счету вхождение искать он (Pos) не знает.
georgys (2002-12-26 15:35:00) [10]n=0;
а почему он только первый пробел ищет?
Reindeer Moss Eater (2002-12-26 15:32:00) [11]Что такое N и чему оно равно?
Твой Pos N-раз подряд находит позицию первого пробела.
Зачем это?
gek (2002-12-26 15:31:00) [12]Если ты по пробелам ориентируешься и только то лучше все же
WrapText() и т.п.
Посм в help
georgys (2002-12-26 15:27:00) [13]
while NOT EOF(f) do begin
readln(f,s);
for i:=1 to n+1 do begin
p:=pos(" ",s);
buf:=copy(s,p+1,Length(s)-p);
end;
Memo1.Lines.Add(buf);
end;
Вот так вот делаю. Но все остальное пропадает.
Reindeer Moss Eater (2002-12-26 15:25:00) [14]А самому поподробнее можно?
Куда пропадает?
georgys (2002-12-26 15:18:00) [15]А поподробнее можно? Я пробовал, но у меня получается выдернуть только ip адрес, а все остальное пропадает куда то... :-(
Song (2002-12-26 15:18:00) [16]WrapText()
Reindeer Moss Eater (2002-12-26 15:16:00) [17]Pos, Copy, Delete ......