чтото внеземное с циклами repeat и while

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by SultanOFF, 11 Dec 2009.

  1. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    Здравствуйте. Есть текст(StrPage) и там с помощью регулярок ищу мыльники. Ищу и пытаюсь их добавить в мемо, но сначало проверяя на дубликаты. Делаю это вот так:
    Code:
    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;
    но вместо того что Я ожидаю бесконечное добавление одних и тех же мыльников. Пытался делать и так
    Code:
    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;
    но теперь уже просто пустота :(
    :( Почему? Помогите пожалуйста!
     
  2. DeaD_MoroZ

    DeaD_MoroZ Banned

    Joined:
    3 Nov 2009
    Messages:
    102
    Likes Received:
    7
    Reputations:
    0
    он у тебя в первом коде проверяет ни равно ли мыло текушей позиции в мемо, если не равно добавляет его... и так дальше...
     
  3. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    Code:
    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;
    теперь уже снова пустота :(
     
  4. DeaD_MoroZ

    DeaD_MoroZ Banned

    Joined:
    3 Nov 2009
    Messages:
    102
    Likes Received:
    7
    Reputations:
    0
    ну как то так...
    Code:
    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;
     
  5. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    DeaD_MoroZ все равно вместо мыл получается одна пустота :(
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    _________________________
  7. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    ну да, потому что если у Меня цикл как в первом посте то мыльники добавляюся :(

    только что попробовал чтото теперь та регулярка не добавляет ничего, вот регулярка Reg2.Expression:= '[\w\d\-\.]+@[\w\d\-]+\.ru' которая выдирает мыльники
     
    #7 SultanOFF, 12 Dec 2009
    Last edited: 12 Dec 2009
  8. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    по ссылке лень тыкнуть?

     
    _________________________
  9. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    все фуух проблему решил кажется наконец:) вот таким способом:
    Code:
    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;
    и использую эти процедуры и функции вот так:
    Code:
    if Reg2.Exec(StrPage) then   begin
     repeat  begin
    bbo(reg2.Match[0]);
    dubl;
    application.ProcessMessages;
     end;
    until not Reg2.ExecNext;
     end;
    ничего оригинальней не придумал, просто при каждом добавлении нового мыла содержимое мемо переносится в тстринГлист и уже оттуда свойством dublicate удаляются дубликаты ну и заново заносятся в мемо. Если у кого есть другие идеи, то пишите пожалуйста :)