【问题标题】:.try with regular expression in ruby.try 在 ruby​​ 中使用正则表达式
【发布时间】:2015-02-09 10:28:47
【问题描述】:

我有一个返回页面标题的方法。标题可以返回包含剧集信息和不包含剧集信息的字符串。例如:“朋友可以聊天”和“第12集空心人”我需要在最后的字符串上使用正则表达式并返回它。

title = row.at("h3")
           .try(:children)
           .try(:first)
           .try(:text)
           .try(:strip)
           .try(:[], /(Episode \d+ [–-]\s*)(.*)/,2)

在这里我得到 Hollow man 作为标题,因为它包含剧集信息并且正则表达式在这里匹配。 但在第一种情况下,它返回 nil,因为“朋​​友可以聊天”没有剧集信息,因此在匹配正则表达式时它会返回 nil。

那么我怎样才能有效地返回它。我可以使用像

title = row.at("h3")
           .try(:children)
           .try(:first)
           .try(:text)
           .try(:strip)

title = title.try(:[], /(Episode \d+ [–-]\s*)(.*)/,2) \
     if title && title.try(:[], /(Episode \d+ [–-]\s*)(.*)/,2)

任何其他我可以有效返回的方式。

【问题讨论】:

    标签: ruby-on-rails ruby regex


    【解决方案1】:

    您可以修改您的正则表达式以使“Episode”字符串不是强制性的:

    # /(Episode \d+ [–-]\s*)(.*)/
    /(Episode\s+\d+\s+[–-]?\s*)?(.*))/
    

    这将匹配两者:

    a = ["Friends Can chat", "Episode 12 Hollow man"]
    a.map { |t| 
      #                  ⇓ No episode?—no worry!
      /(Episode\s+\d+\s*)?(.*)/ =~ t
      ($~[1] ? $~[1] : 'NO EPISODE ') + $~[2] 
    }
    # [
    #  [0] "NO EPISODE Friends Can chat",
    #  [1] "Episode 12 Hollow man"
    # ]
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多