2012-02-28 3 views
6

Я новичок в Ruby и немного смущен командой grep в этом блоке кода. Я пытаюсь собрать все имена почтовых ящиков через Net :: IMAP, а затем проверить их на аргумент почтового ящика. Вероятно, имя почтового ящика будет включать только часть аргумента. Например, кто-то может ввести «Отправлено» в качестве почтового ящика, но много раз имя почтового ящика будет «INBOX.Sent».Ruby grep - поиск массива для частей строки

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 

Итак, сначала я пробовал .any? но это не возвращает мне имя фактического почтового ящика. С .grep я могу получить список почтовых ящиков, когда @mailbox = "INBOX". Однако, когда @mailbox = "Sent" он просто возвращает [].

Вот пример одного, который работает (с использованием «INBOX») и тот, который не делает (с использованием «Отправленные»):

#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"] 

Я думаю, что проблема в том, что «INBOX» находится на начало строк в массиве, но «Отправлено» находится посередине и находится после периода. Не знаете, как исправить.

ответ

12

Try:

mailbox_array.grep(/Sent/) 

Символ^означает поиск с начала строки.

+0

Хм это тоже работает. Я предполагаю, что \ b не нужен. – krapdagn

+2

@krapdagn: yup, хотя это также соответствовало бы строкам типа «Sentiments» и «MySentMail», которые вы можете или не захотите. – maerics

7

специальный символ регулярного выражения ^ матчи только начала строки поэтому, возможно, вы хотите, чтобы соответствовать границе слова (\b) вместо. Попробуйте это:

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

Woohoo! Мне нужно будет изучить эти регулярные выражения больше :). Огромное спасибо. – krapdagn

+0

OK - еще один вопрос, извините. Когда почтовый ящик = «Отправленные сообщения», например, он возвращает []. Я думаю, это из-за двойных кавычек. Как манипулировать почтовым ящиком так, чтобы он вписывался в grep (/ mailbox /) без «вокруг»? – krapdagn

+1

Ah - понял это: grep (/ # {@ mailbox} /) – krapdagn

Смежные вопросы