如何制作regexp我不需要匹配/可选匹配的Ruby?

时间:2014-05-18 13:09:02

标签: ruby regex

我试图创建一个匹配某些字符串部分的正则表达式。 我不必匹配每个部分,但至少有一个(它总是会)

我想:名字和年份和/或季节/剧集。

让我说我有这些字符串:

  1. i.want.this.as.name.2014.s01e02
  2. 我还想要一个2010年
  3. 我也想要这个
  4. 我仍然想要这个.05E23.720p.HDTV.X264
  5. 我想得到这些比赛:

    1. 
    name =  i.want.this.as.name.
    year =  2014
    seasonepisode =     s01e02
    season =    01
    episode =   02
    2.
    name = i still want a this
    year = 2010
    3.
    name = i also want this
    4.
    name =  I still want this
    seasonepisode =     s05e23
    season =    05
    episode =   23
    

    现在,我有这个正则表达式:

    (?<name>.*)(?<year>\d{4})(\s|\.|\z)*(?<seasonepisode>s(?<season>\d{1,2})e(?<episode>\d{1,2}))*
    

    但我只在第一个字符串上得到了所需的结果。我想这是因为字符串2,3或4中的完整正则表达式没有匹配。

    您可以在这里试用正则表达式:http://rubular.com/r/1ypseJ7c6I

    所以我的问题是,我如何告诉正则表达式我不需要对所有内容进行匹配,只是一些东西? :-)我尝试将asterix添加到opitonal。

    5€捐赠给您选择的项目/慈善机构以获得正确答案:-)

1 个答案:

答案 0 :(得分:2)

这可能有效:http://rubular.com/r/4qYuzGGqaB。使用/ix选项,后者是为了便于阅读。

^
(?<nm>.+?)        # Name: at least one character, non-greedy.
(?<yr>\d{4})?     # Year, optional.
(?:               # Post-year stuff, non-captured.
  [\s\.]
  s(?<se>\d\d?)   # Season.
  e(?<ep>\d\d?)   # Episode.
  (?<rest>.*)     # The rest, optional.
)?                # Post-year stuff is optional.
$                 # Must consume full line.

几点说明:

  • 名字组的非贪婪很重要。否则,它将很乐意消耗整行(其他一切都是可选的)。

  • 要求全线匹配也很重要。否则,模式将很乐意仅匹配行的第一个字母(名称是非贪婪的,其他一切都是可选的)。