Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.25;
Скачать: CL | DM;

Вниз

Поиск в тексте   Найти похожие ветки 

 
arturich ©   (2007-03-03 03:50) [0]

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

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


 
Джо ©   (2007-03-03 04:30) [1]

> как получить "неизвестный текст", например, во второй memo2?

Memo2.Lines.Add("http://неизвестныйтекст.ru");
И это не стеб, а прямой ответ на вопрос.


 
arturich ©   (2007-03-03 05:37) [2]

Джо, нет, мне не нужна часть с http и ru, нужна часть что между ними, причём кол-во символов этой части я не знаю


 
Джо ©   (2007-03-03 05:42) [3]

Есть такая функция Pos. Возвращает позицию подстроки в строке. И есть такая функция Copy. Копирует указанное кол-во символов начиная с указанной позиции.


 
fd979 ©   (2007-03-03 09:22) [4]

Это для того, чтобы выделить искомый текст. Измени под свои нужды.
     for I := 0 to Memo1.Lines.Count do
     begin
       S1 := UpperCase(Memo1.Lines[I]);
       PosReturn := Pos(UpperCase(искомый текст), S1);

       if PosReturn <> 0 then {found!}
       begin
         SkipChars := 0;
         for J := 0 to I - 1 do
           SkipChars := SkipChars + Length(Memo1.Lines[J]);
         SkipChars := SkipChars + (I*2);
         SkipChars := SkipChars + PosReturn - 1;
         Memo1.SetFocus;
         Memo1.SelStart := SkipChars;
         Memo1.SelLength := Length(искомый текст);
       end;
     end;


 
Dmitrij_K   (2007-03-03 10:20) [5]

как вариант можно использовать регулярные выражения www.regexpstudio.com


 
arturich ©   (2007-03-03 17:28) [6]

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


 
PZ   (2007-03-03 17:47) [7]

Приблизительно так:
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));


 
arturich ©   (2007-03-03 18:06) [8]

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


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

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


 
arturich ©   (2007-03-03 18:25) [10]

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

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


 
PZ   (2007-03-03 18:42) [11]

Вот работающий вариант:
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:53) [12]

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


 
PZ   (2007-03-03 19:06) [13]

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


 
arturich ©   (2007-03-03 19:24) [14]

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

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

end;


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


 
PZ   (2007-03-03 19:43) [15]

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


 
arturich ©   (2007-03-03 19:45) [16]

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


 
RASkov   (2007-03-03 20:08) [17]

> [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 то будет логическая ошибка.


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

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


 
arturich ©   (2007-03-03 21:03) [19]

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


 
Dmitrij_K   (2007-03-03 21:41) [20]

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:51) [21]

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


 
Dmitrij_K   (2007-03-03 21:55) [22]

var
r:TRegExpr;


 
Dmitrij_K   (2007-03-03 21:55) [23]

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


 
arturich ©   (2007-03-03 22:22) [24]

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


 
Dmitrij_K   (2007-03-03 22:29) [25]

тут 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 23:04) [26]

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



Страницы: 1 вся ветка

Текущий архив: 2007.03.25;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.049 c
2-1172776344
sat
2007-03-01 22:12
2007.03.25
командная строка


4-1162976299
-=mih@=-
2006-11-08 11:58
2007.03.25
Нормальная регистрация файла!!!


2-1172999997
azl
2007-03-04 12:19
2007.03.25
Сортировка записей в текстовом файле


15-1172655084
stone
2007-02-28 12:31
2007.03.25
Ох уж эти инициаторы...


1-1170534006
Express
2007-02-03 23:20
2007.03.25
Как перехватить сообщение об открытие MDI-формы??