2012-02-28 31 views
6

Tôi mới dùng Ruby và một chút nhầm lẫn với lệnh grep trong khối mã này. Tôi đang cố gắng thu thập tất cả các tên hộp thư thông qua Net :: IMAP và sau đó kiểm tra chúng chống lại một đối số hộp thư. Có khả năng tên hộp thư sẽ chỉ bao gồm một phần của đối số. Ví dụ: ai đó có thể nhập "Đã gửi" làm hộp thư nhưng nhiều lần tên hộp thư sẽ là "INBOX.Sent".Ruby grep - tìm kiếm một mảng cho các phần của chuỗi

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 

Vì vậy, trước tiên tôi đã thử .any? nhưng điều đó không trả lại cho tôi tên của hộp thư thực. Với .grep, tôi có thể nhận danh sách các hộp thư khi @mailbox = "INBOX". Tuy nhiên, khi @mailbox = "Sent" nó chỉ trả lại [].

Dưới đây là một ví dụ về một trong những hoạt (sử dụng "INBOX") và một trong đó không thực hiện (sử dụng "Sent"):

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

Tôi nghĩ vấn đề là "INBOX" là ở bắt đầu của các chuỗi trong mảng, nhưng "Đã gửi" ở giữa và sau một khoảng thời gian. Không chắc chắn cách khắc phục.

Trả lời

12

Hãy thử:

mailbox_array.grep(/Sent/) 

Các^nghĩa là tìm kiếm ngay từ đầu của dòng.

+0

Hmm cũng hoạt động. Tôi đoán \ b là không cần thiết. – krapdagn

+2

@krapdagn: yup, mặc dù điều này cũng sẽ khớp với các chuỗi như "Tình cảm" và "MySentMail", mà bạn có thể hoặc không muốn. – maerics

7

Ký tự regex đặc biệt ^ chỉ khớp với số bắt đầu của chuỗi vì vậy có lẽ bạn muốn khớp đường biên từ (\b) thay thế. Hãy thử điều này:

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

Woohoo! Tôi sẽ cần phải nghiên cứu những biểu thức chính quy hơn :). Cảm ơn bạn rất nhiều. – krapdagn

+0

OK - một câu hỏi nữa, xin lỗi. Ví dụ: khi hộp thư = "Tin nhắn đã gửi", nó trả về []. Tôi nghĩ điều này là do các dấu ngoặc kép. Làm thế nào để thao tác hộp thư để nó phù hợp trong grep (/ mailbox /) mà không có "" xung quanh nó? – krapdagn

+1

Ah - figured it out: grep (/ # {@ mailbox} /) – krapdagn

Các vấn đề liên quan