【问题标题】:Ruby grep - searching an array for parts of a stringRuby grep - 在数组中搜索字符串的一部分
【发布时间】:2012-03-18 05:45:46
【问题描述】:

我是 Ruby 新手,对这段代码中的 grep 命令有点困惑。我试图通过 Net::IMAP 收集所有邮箱名称,然后根据邮箱参数检查它们。邮箱名称可能只包含部分参数。例如,有人可能输入“Sent”作为邮箱,但很多时候邮箱名称将是“INBOX.Sent”。

   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”)和一个无效的示例(使用“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"]

我认为问题在于“INBOX”在数组中字符串的开头,但“Sent”在中间并且在一段时间之后。不知道如何解决。

【问题讨论】:

    标签: ruby grep imap


    【解决方案1】:

    试试:

    mailbox_array.grep(/Sent/)
    

    ^ 表示从行首开始搜索。

    【讨论】:

    • @krapdagn: 是的,虽然这也会匹配诸如“Sentiments”和“MySentMail”之类的字符串,你可能想要也可能不想要。
    【解决方案2】:

    特殊的正则表达式字符 ^ 仅匹配 字符串的开头,因此您可能想要匹配单词边界 (\b)。试试这个:

    mailbox_array.grep(/\bSent\b/)
    

    【讨论】:

    • 哇哦!我需要更多地研究这些正则表达式:)。非常感谢。
    • 好的——还有一个问题,抱歉。例如,当邮箱 =“已发送消息”时,它返回 []。我认为这是因为双引号。如何操作邮箱,使其适合 grep(/mailbox/) 周围没有“”?
    • 啊-想通了:grep(/#{@mailbox}/)
    • 值得注意的是,ruby 中的^ 将匹配任何行的开头。 \A 将匹配输入的绝对开头。 (与$ / \Z 相同。)
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2015-05-12
    • 2012-07-16
    相关资源
    最近更新 更多