2012-02-28 26 views
6

Bu yeni kod bloğundaki Ruby ve biraz da grep komutuyla karıştırıyorum. Tüm posta kutusu adlarını Net :: IMAP aracılığıyla toplamaya çalışıyorum ve sonra bunları bir posta kutusu argümanına karşı kontrol ediyorum. Muhtemelen posta kutusu adı sadece argümanın bir kısmını içerecektir. Örneğin, bir kişi posta kutusu olarak "Gönderildi" olarak yazabilir, ancak birçok kez posta kutusu adı "INBOX.Sent" olacaktır.Ruby grep - bir dizinin parçaları için bir dizi aranıyor

class ExamineMail 
     def initialize(user, domain, pass, box) 
      @username = user 
      @domain = domain 
      @pass = pass 
      @mailbox = box 
     end 

     def login() 
      @imap = Net::IMAP.new("mail." + @domain) 
      @imap.authenticate('LOGIN', @username + "@" + @domain, @pass) 
      mailbox_array = @imap.list('','*').collect{ |mailbox| mailbox.name } 
      #mailbox_array.any? { |w| @mailbox =~ /#{w}/ } 
      mailbox_array.grep(/^@mailbox/) 
     end 
    end 

İlk önce denedim. ama bu bana gerçek posta kutusunun adını vermiyor. .grep ile, @mailbox = "INBOX" adresinden posta kutularının listesini alabiliyorum. Ancak, @mailbox = "Sent", [] değerini döndürür. İşte

("Gönderildi" kullanarak) ve yapmayan birini ("INBOX" kullanarak) çalışır birinin bir örnek:

#Get the list of inboxes 
mailbox_array = imap.list('','*').collect{ |mailbox| mailbox.name } 
=> ["INBOX", "INBOX.Trash", "INBOX.Sent", "INBOX.Sent Messages", "INBOX.Junk", "INBOX.Drafts", "INBOX.Deleted Messages", "INBOX.Apple Mail To Do"] 

#Search for mailboxes including "Sent" 
>> mailbox_array.grep(/^Sent/) 
=> [] 

#Search for "INBOX" 
>>    mailbox_array.grep(/^INBOX/) 
=> ["INBOX", "INBOX.Trash", "INBOX.Sent", "INBOX.Sent Messages", "INBOX.Junk", "INBOX.Drafts", "INBOX.Deleted Messages", "INBOX.Apple Mail To Do"] 

Sorun "POSTALAR" altında olduğunu düşünüyorum dizideki dizelerin başlangıcı, ancak "Gönderilen" ortada ve bir süre sonra. Nasıl düzeltileceğinden emin değilim. dize sadece başlangıcı

cevap

12

Dene:

mailbox_array.grep(/Sent/) 

^satırın başından aramayı ifade eder.

+0

Hmm bu da işe yarıyor. Sanırım gerekli değil. – krapdagn

+2

@krapdagn: yup, bununla birlikte isteyebileceğiniz veya istemediğiniz "Sentiments" ve "MySentMail" gibi dizeleri de eşleştirebilir. – maerics

7

özel regex karakter ^ maçlar belkide bunun yerine bir kelime sınırı (\b) eşleşmesi istiyorum. Bu deneyin:

mailbox_array.grep(/\bSent\b/) 
+0

Woohoo! Bu düzenli ifadeleri daha fazla çalışmaya ihtiyacım olacak :). Çok teşekkür ederim. – krapdagn

+0

Tamam - bir soru daha, üzgünüm. Örneğin, posta kutusu = "Gönderilmiş Mesajlar" olduğunda, [] değerini döndürür. Bunun ikili alıntılardan kaynaklandığını düşünüyorum. Posta kutusunu, etrafında "" olmadan grep (/ mailbox /) içine sığacak şekilde nasıl işlersiniz? – krapdagn

+1

Ah - bunu çözdü: grep (/ # {@ mailbox} /) – krapdagn

İlgili konular