PDA

Просмотр полной версии : чтото внеземное с циклами repeat и while


SultanOFF
11.12.2009, 22:22
Здравствуйте. Есть текст(StrPage) и там с помощью регулярок ищу мыльники. Ищу и пытаюсь их добавить в мемо, но сначало проверяя на дубликаты. Делаю это вот так:
if Reg2.Exec(StrPage) then //strPage содержится html код страницы, reg2.exec проверяет его на наличие мыл
begin
repeat
for i:=0 to memo1.Lines.Count-1 do
if reg2.Match[0]<>Memo1.Lines[i] then //в reg2.Match[0] содержится мыло и если его нет в memo1
Memo1.Lines.Add(reg2.Match[0]) //то собсвтенно и добавляем это мыло в мемо1
until not Reg2.ExecNext; //переходим к следущему мылу в strPage
end; но вместо того что Я ожидаю бесконечное добавление одних и тех же мыльников. Пытался делать и так
X := Reg2.Exec(StrPage);
while X do
begin
for i:=0 to memo1.Lines.Count-1 do
if reg2.Match[0]<>Memo1.Lines[i] then
Memo1.Lines.Add(reg2.Match[0]);
X := Reg2.ExecNext;
end;
но теперь уже просто пустота :(
:( Почему? Помогите пожалуйста!

DeaD_MoroZ
12.12.2009, 06:34
он у тебя в первом коде проверяет ни равно ли мыло текушей позиции в мемо, если не равно добавляет его... и так дальше...

SultanOFF
12.12.2009, 06:56
if Reg2.Exec(StrPage) then
begin
repeat
for i:=0 to memo1.Lines.Count-1 do begin
if reg2.Match[0]<>Memo1.Lines[i] then begin
Memo1.Lines.Add(reg2.Match[0]) ;
break;
end
end;
until not Reg2.ExecNext;
end; теперь уже снова пустота :(

DeaD_MoroZ
12.12.2009, 07:10
ну как то так...
if Reg2.Exec(StrPage) then begin
k:=0;
repeat
for i:=0 to memo1.Lines.Count-1 do
if reg2.Match[0]<>Memo1.Lines[i] then
inc(k);

if k=memo1.Lines.Count-1 then
Memo1.Lines.Add(reg2.Match[0])

until not Reg2.ExecNext;
end;

SultanOFF
12.12.2009, 12:06
DeaD_MoroZ все равно вместо мыл получается одна пустота :(

Gar|k
12.12.2009, 14:27
SultanOFF у тебя регулярка (http://www.pcre.ru/examples/links/text/32/) то правильная?

SultanOFF
12.12.2009, 16:33
ну да, потому что если у Меня цикл как в первом посте то мыльники добавляюся :(

только что попробовал чтото теперь та регулярка не добавляет ничего, вот регулярка Reg2.Expression:= '[\w\d\-\.]+@[\w\d\-]+\.ru' которая выдирает мыльники

Gar|k
12.12.2009, 17:03
по ссылке лень тыкнуть?

Извлечение email-адреса даже если он обрамлен служебными знаками

Пример использования регулярного выражения, извлекающего все адреса электронной почты с доменом любого уровня из произвольной строки, даже если они обрамлены любыми служебными знаками.
# Пример в PHP

$text = '"Vasiliy Ivanovitch" y@mail.org.kol.ru (*ColdplayC*) "l@mbr.uk.com" kol@kol.com serjio k <orba@kimori.org.ua>, serjio k <orba1@kimori.org.ua>';

$out = array();

preg_match_all('/[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?[\
.A-Za-z0-9]{2,}/', $text, $out);

# $out[1] будет содержать массив email-адресов:
# y@mail.org.kol.ru
# l@mbr.uk.com
# kol@kol.com
# orba@kimori.org.ua
# orba1@kimori.org.ua

Serjio, 11.05.2007.

SultanOFF
12.12.2009, 19:58
все фуух проблему решил кажется наконец:) вот таким способом:
procedure dubl;
var
SL : TStringList;
i, i2 : integer;
flag : Boolean;
begin
SL := TStringList.Create;
SL.AddStrings(form1.Memo1.Lines);
for i := form1.Memo1.Lines.Count - 1 downto 0 do
begin
flag := False;
for i2 := SL.Count - 1 downto 0 do
begin
if form1.Memo1.Lines[i] = SL.Strings[i2] then
if flag then
SL.Delete(i2)
else
flag := True;
end;
end;
form1.Memo1.Clear;
form1.Memo1.Lines.AddStrings(SL);
SL.Free;

end;

function bbo(s:string):boolean;
var i:integer;
flag:boolean;
begin
flag:=true;
for i:=0 to form1.memo1.Lines.Count do begin
if s=form1.Memo1.Lines[i] then
begin

flag:=false;

end;
if flag then begin

form1.Memo1.Lines.Add(s) ;
break;
end;
end;
end;
и использую эти процедуры и функции вот так:
if Reg2.Exec(StrPage) then begin
repeat begin
bbo(reg2.Match[0]);
dubl;
application.ProcessMessages;
end;
until not Reg2.ExecNext;
end;
ничего оригинальней не придумал, просто при каждом добавлении нового мыла содержимое мемо переносится в тстринГлист и уже оттуда свойством dublicate удаляются дубликаты ну и заново заносятся в мемо. Если у кого есть другие идеи, то пишите пожалуйста :)