【问题标题】:Rspec tests hang with regexRspec 测试使用正则表达式挂起
【发布时间】:2014-10-21 07:21:59
【问题描述】:

我(非常)是 Ruby 新手,不知道为什么我的 rspec 挂起。我在下面给出的方法中有两个正则表达式。如果我将其中一个注释掉,则 rspec 有效。但如果两者都存在,rspec 会挂起(link to full project, including tests,如果它有助于提供上下文)

示例输入:

pairings= [["Joe Johnson", "Jane Johnson"], ["Sarah Smith", "Bob Jones"]]

期望的输出:

self.valid_pairs?(pairings) => false ... because the last names in the pairings[0] are the same

代码

def self.valid_pairs?(pairings)

 validated_pairings = []
 pairings.each do |p|
   match1 = /(\w*)\s(\w*)|(\w*)\s(\w*)\s(\w*)/.match(p[0]).to_a 
   match2 = /(\w*)\s(\w*)|(\w*)\s(\w*)\s(\w*)/.match(p[1]).to_a

   if match1.last != match2.last
     validated_pairings << p
   else
   end
 end

 if validated_pairings == pairings
   true
 else
   false
 end

end

【问题讨论】:

  • 你的正则表达式没有太多意义,因为它只能匹配一个空格。你能放一个样本数据和你想要的输出吗?
  • 我添加了示例输入和所需的输出。我不确定这是否有帮助 - 这是我发布的第一个问题,所以如果我误解了您的要求,请告诉我。
  • 我明白了,您要做的是比较姓氏。您需要的正则表达式是获取姓氏

标签: ruby regex rspec


【解决方案1】:

如果你的方法是:

def any_matching_last_names?(pairings)
  pairings.any? { |p1,p2| p1.last_name == p2.last_name }
end

last_name 以您喜欢的任何方式从p1p2 中提取姓氏(例如p.split.lastp[/\w+$/]。如果此方法返回falsepairings 将是“有效的” ,所以你可以这样使用它:

list.add(pairings) unless any_matching_last_names?(pairings)

【讨论】:

    【解决方案2】:

    您不需要正则表达式来获取可以使用的最后一个单词split

    match1 = p[0].split
    match2 = p[1].split
    

    您还可以使用all? 大大简化您的代码:

    def self.valid_pairs?(pairings)
      pairings.all? do |p1, p2|
        p1.split.last != p2.split.last
      end
    end
    

    仅当 pairings 数组中的所有元素都返回 true 时,上述代码才返回 true,因为两个名称的姓氏不同。

    【讨论】:

      【解决方案3】:

      您可以使用以下正则表达式来获取姓氏:

      (\w+)$
      

      Working demo

      要从捕获组中获取内容,您可以这样做:

      lastname = /(\w+)$/.match(p[0]).captures
      

      所以,对于:

      lastname = /(\w+)$/.match("Sarah Smith").captures
      // lastname => "Smith"
      

      我把编码留给你

      【讨论】:

        猜你喜欢
        • 2016-06-30
        • 1970-01-01
        • 2011-01-25
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多