Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   чтото внеземное с циклами repeat и while (https://forum.antichat.xyz/showthread.php?t=162790)

SultanOFF 11.12.2009 22:22

чтото внеземное с циклами repeat и while
 
Здравствуйте. Есть текст(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 у тебя регулярка то правильная?

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 удаляются дубликаты ну и заново заносятся в мемо. Если у кого есть другие идеи, то пишите пожалуйста :)


Время: 04:25