Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

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

 
4ubaka   (2005-06-11 13:20) [0]

Добрый день. Пишу программу, которая умеет выделять(находить) все адреса email в тексте TMemo.
Написал алгоритм, который находит положение @ в тексте, а потом копирует по одному символу с каждой стороны от @ пока не встретиться пробел или кавычки. Но он не работает.
Может кто-то сталкивался с подобной задачей? Помогите! Можно на email: kev89@mail.ru


 
TUser ©   (2005-06-11 13:23) [1]

> Написал алгоритм, который находит положение @ в тексте, а потом копирует по одному символу с каждой стороны от @ пока не встретиться пробел или кавычки. Но он не работает.

Выделенные жирным слова противоречат друг другу. А вообще - спамерам - бой!


 
Homa_Programer ©   (2005-06-11 13:29) [2]

а что за ошибка то вылазит? в чем проблема... вроде смысл правильный... а вот как реализовано у тебя?!


 
4ubaka   (2005-06-11 13:31) [3]

Ошибка как раз не вылазит, вообще ничего не вылазит.
И я не спамер.

procedure TForm1.emailerExecute(Sender: TObject);
var
i,n:integer;
s:string;
begin
n:=length(memo1.Text);
while i < n do
begin
 i:=pos("@",memo1.Text);
 CheckListBox1.Items.Insert(0,DetectAddress(i));
end;
end;

function TForm1.DetectAddress(posn: integer): string;
var
start,fin,s,f:string;
d,n,i:integer;
begin
 for i:=0 to 100 do
  begin
    f:=copy(memo1.Text,posn-i,1);
     while not (f=" ") do
      begin
        start:=f+start;
      end;
      if f=" " then
      break;
  end;

  for i:=0 to 100 do
   begin
     f:=copy(memo1.Text,posn+i,1);
      while not (f=""") or not (f=" ") do
       begin
        fin:=f+fin;
       end;
       if (f=""") or (f=" ") then
       break;
    end;
    result:=start+"@"+fin;
end;


 
-=XP=- ©   (2005-06-11 13:50) [4]

SPAMERS MUST DIE


 
TUser ©   (2005-06-11 13:53) [5]

Что-то вроде этого, только учти, что этот подход ни в коем случае не является универсальным. Например, существуют концы строки и другие символы, которые никак не могут быть в составе адреса.

procedure FindAddressesInMemo (SL: TStrings);
var i: integer;
   start, finish: integer;
   state: smallint;

procedure Proceed (C: char);
begin
   case C of
     " ", """:
      begin
        if state = 3 then
          SL.Add(copy(Memo1.Lines,Text,start,finish-start+1));
        state:=0;
      end;
     "@":
      if state = 1 then begin        
        inc (finish); state:=2;
        end;
     else
      begin
        if state = 0 then begin
          state:=1; start:=i; finish:=i-1;
          end else
        if state = 2 then
          state = 3;
        inc (finish);
      end;
     end;

end;

begin
 state:=0;
 for i:=1 to length(Memo1.Lines.Text) do
   Proceed(Memo1.Lines.Text[i]);
 Proceed(" ");
end;


 
4ubaka   (2005-06-11 17:05) [6]

Удалено модератором


 
iskatel ©   (2005-06-11 18:29) [7]

короче тебе прямая дорога regexp - ы изучать, они тебе помогут, можешь попробовать TRegExp, но он слабоват, покруче будет VbScript Regular Expression - ставится вместе с оффисом, но можно отдельно dll  перетащить - но придется юзать COM


 
TUser ©   (2005-06-11 18:59) [8]

> iskatel ©   (11.06.05 18:29) [7]

Регулярными выражениями адреса вытаскивать - это как из пушки по воробьям.


 
iskatel ©   (2005-06-11 19:48) [9]

зря ты так - использовать их не сложно, особенно TRegExp, зато вытащит наверняка, и на всякие левые @ не среагирует...


 
Николай,гер   (2005-06-12 14:27) [10]

Удалено модератором
Примечание: Ник измени


 
Николай,герм   (2005-06-12 19:30) [11]

у меня есть другой варант :
только коментов мало .

procedure TForm1.BitBtn1Click(Sender: TObject);
var
mail, text, affeN:string;
k ,i,anzh,voranzh: integer;
begin
k:=0;
affeN:="";
text := RichEdit1.Text;
for i:=0 to Length(text) do
begin

  if ("@"= Copy(text,i-1,1)) then
   begin
     k:=k+1;
     BitBtn1.Caption:= IntToStr(k);
     anzh:=0;
   // Найти после  @
    repeat
      anzh:=anzh+1;
    until ("""= Copy(text,i+anzh,1));

  // Найти до @
    voranzh:=i;
    repeat
      voranzh:=voranzh-1;
    until (":"= Copy(text,voranzh,1));

    affeN:= Copy(text,voranzh+1,(i-voranzh+anzh-1))+ " ";
    voranzh:=0;
    mail := mail + affeN;
    affeN:="";
   end;
end;
 Richedit2.Lines.Add(mail) ;

 BitBtn1.Caption:= "Finden mails und anzeigen  mails adressen gefunden Anzahl : " + IntToStr(k);
 RichEdit1.Clear;
end;


моэет кому поможет.



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.052 c
1-1118444356
gans_2
2005-06-11 02:59
2005.07.11
как запретить редактирование отдельной ячейки StringGrid


4-1116062353
LaMaX
2005-05-14 13:19
2005.07.11
Проблема с буфером для вывода текста в различных режимах


1-1119434277
syte_ser78
2005-06-22 13:57
2005.07.11
как определить/установить скорость вращения трехконтактного кулер


1-1118890532
FDA
2005-06-16 06:55
2005.07.11
Как открыть файл AutoCAD?


14-1118379504
boriskb
2005-06-10 08:58
2005.07.11
Есть желающие прокоментировать?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский