Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
2-1172599961
Василиус
2007-02-27 21:12
2007.03.25
помогите позжалста...


15-1172479216
NailMan
2007-02-26 11:40
2007.03.25
WinXP 32-бит и 4Гб памяти


2-1172973841
arturich
2007-03-04 05:04
2007.03.25
Работа с TProgressBar


1-1170086245
Express
2007-01-29 18:57
2007.03.25
Как присвоить событие кнопки созданной в библиотеке?


15-1172522655
Kerk
2007-02-26 23:44
2007.03.25
Работа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский