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

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

Поиск в тексте


Страницы:   1 2

arturich ©   (2007-03-03 03:50:00) 

Есть массивный текст в memo1, в нём присутсвуют такие словосочетания: http://неизвестныйтекст.ru
как получить 'неизвестный текст', например, во второй memo2?

заранее спасибо!


arturich   (2007-03-03 23:04:00) [1]

спасибо, работает!


Dmitrij_K   (2007-03-03 22:29:00) [2]

тут www.regexpstudio.com все написано по-русски

r:=TRegExpr.Create;
try
r.ModifierStr := 'grs-imx';
r.Expression := 'http://(.*?)\.ru';
if r.Exec(memo2.Text) then
repeat
  memo2.Lines.Add(r.Match[1]);
until not r.ExecNext;
finally
r.Free;
end;


arturich   (2007-03-03 22:22:00) [3]

он вытаскивает линки целиком, как вытащить только то что между http:// и .ru ?


Dmitrij_K   (2007-03-03 21:55:00) [4]

сайт же написал


Dmitrij_K   (2007-03-03 21:55:00) [5]

var
r:TRegExpr;


arturich   (2007-03-03 21:51:00) [6]

Dmitrij_K, а что есть "r"?


Dmitrij_K   (2007-03-03 21:41:00) [7]

r:=TRegExpr.Create;
try
 r.ModifierStr := 'grs-imx';
 r.Expression := ' http://.*?\.ru';
 if r.Exec(memo2.Text) then
 repeat
   memo2.Lines.Add(r.Match[0]);
 until not r.ExecNext;
finally
r.Free;
end;

www.regexpstudio.com


arturich   (2007-03-03 21:03:00) [8]

RASkov, здорово, действительно всё работает
только как с помощью этого кода найти множество таких текстов как http://текст.ru? то есть, чтобы код нашёл все линки?


RASkov   (2007-03-03 20:18:00) [9]

Т.е. это доработанный вариант [11]...


RASkov   (2007-03-03 20:08:00) [10]

> [16] arturich ©   (03.03.07 19:45)


> только убрать параметр Р-1. Пробуйте

С таким раскладом может работать немного неверно....Вот еще вариант:

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer; //StrUtils.pas
var
 I,X: Integer;
 Len, LenSubStr: Integer;
begin
 if Offset = 1 then
   Result := Pos(SubStr, S)
 else
 begin
   I := Offset;
   LenSubStr := Length(SubStr);
   Len := Length(S) - LenSubStr + 1;
   while I <= Len do
   begin
     if S[I] = SubStr[1] then
     begin
       X := 1;
       while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
         Inc(X);
       if (X = LenSubStr) then
       begin
         Result := I;
         exit;
       end;
     end;
     Inc(I);
   end;
   Result := 0;
 end;
end;

function ReturnStr(const Str, bStr, eStr: String): String;
var P1, P2, N: Integer;
begin
 P1:=PosEx(bStr, Str);
 P2:=PosEx(eStr, Str, P1);
 N:=P1+Length(bStr);
 Result:=Copy(Str, N, P2-N);
end;


Вызов:

Memo2.Lines.Add(ReturnStr(Memo1.Text, 'http://', '.ru'));

или для теста:

ShowMessage(ReturnStr('wetwetr w   (.ru)   etwet wetwet http://неизвестныйтекст.ru wetr wetwevzxcg e67e45 ae6', 'http://', '.ru'));

Если убрать Р1 то будет логическая ошибка.


arturich   (2007-03-03 19:45:00) [11]

спасибо вам большое!!


PZ   (2007-03-03 19:43:00) [12]

В D7 функция
PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
Вам, в таком случае надо использовать Ф-цию Pos или оставить как есть в примере, только убрать параметр Р-1. Пробуйте.
Я больше не могу оставаться в Internet сегодня.


arturich   (2007-03-03 19:24:00) [13]

у меня delphi 6, uses StrUtils добавил

Функция PosEx такая:
function PosEx(Substr: string; S: string;): Integer;
begin

end;


всё ли правильно?


PZ   (2007-03-03 19:06:00) [14]

В [11] я дал работающий пример для Delphi 7. Повторите его у себя, не забудьте добавить uses StrUtils;. Еще раз повторяю: этот пример работает.


arturich   (2007-03-03 18:53:00) [15]

функция posex представляет собой Substr: string и S: string
тогда если P2 := PosEx('.ru', Memo1.text, P1+1); нужно дописать какой-то параметр в функцию, иначе P1+1 программа считает лишним параметром (


PZ   (2007-03-03 18:42:00) [16]

Вот работающий вариант:
uses StrUtils;

Var
 P1, P2 : Integer;
 S : String;

procedure TForm1.Button1Click(Sender: TObject);
begin
 P1 := PosEx('http://', Memo1.text);
 P2 := PosEx('.ru', Memo1.text, P1+1);
 S := Copy(Memo1.text, P1+7, P2-(P1+7));

 ShowMessage(S);
end;


arturich   (2007-03-03 18:25:00) [17]

PosEx('.ru', Memo1.text, P1+1);

too many actual parameters пишет для куска , P1+1);


PZ   (2007-03-03 18:13:00) [18]

PosEx - это функция такая, ищет позицию подстроки в строке. См. Справку по F1


arturich   (2007-03-03 18:06:00) [19]

что тут является posex? O_o


PZ   (2007-03-03 17:47:00) [20]

Приблизительно так:
P1, P2 : Integer;
S : String;
P1 := PosEx('http://', Memo1.text);
P2 := PosEx('.ru', Memo1.text, P1+1);
S := Copy(Memo1.text, P1+9, P2-(P1+8));


Страницы:   1 2

Наверх

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