Форум: "Начинающим";
Текущий архив: 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