2012-02-28 17 views
6

Soy nuevo en Ruby y estoy un poco confundido por el comando grep en este bloque de código. Intento reunir todos los nombres de los buzones a través de Net :: IMAP y luego compararlos con un argumento de buzón. Es probable que el nombre del buzón solo incluya parte del argumento. Por ejemplo, alguien puede escribir "Enviado" como el buzón, pero muchas veces el nombre del buzón será "ENTRADA.Enviada".Ruby grep: buscando en una matriz partes de una cadena

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 

Así que, primero probé .any? pero eso no me devuelve el nombre del buzón real. Con .grep, puedo obtener una lista de los buzones cuando @mailbox = "INBOX". Sin embargo, cuando @mailbox = "Sent" devuelve [].

Aquí es un ejemplo de uno que funcione (usando "Entrada") y uno que no lo hace (usando "Enviado"):

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

Creo que el problema es que "CORREO" está en el principio de las cadenas en la matriz, pero "Enviado" está en el medio y está después de un punto. No estoy seguro de cómo solucionarlo

Respuesta

12

Probar:

mailbox_array.grep(/Sent/) 

El^significa búsqueda desde el principio de la línea.

+0

Hmm esto también funciona. Supongo que no es necesario. – krapdagn

+2

@krapdagn: yup, aunque esto también coincidiría con cadenas como "Sentiments" y "MySentMail", que es posible que desee o no. – maerics

7

El carácter especial de expresiones regulares ^ partidos sólo el principio de la cadena así que tal vez quieren que coincida con un límite de palabra (\b) en su lugar. Prueba esto:

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

Woohoo! Tendré que estudiar estas expresiones regulares más :). Muchas gracias. – krapdagn

+0

OK - una pregunta más, lo siento. Cuando buzón = "Mensajes enviados", por ejemplo, devuelve []. Creo que esto se debe a las comillas dobles. ¿Cómo manipular el buzón para que encaje en grep (/ mailbox /) sin "" a su alrededor? – krapdagn

+1

Ah - lo resolvió: grep (/ # {@ mailbox} /) – krapdagn

Cuestiones relacionadas