如何使regexp I Ruby不需要匹配/可选匹配?

如何使regexp I Ruby不需要匹配/可选匹配?,ruby,regex,Ruby,Regex,我正在尝试创建一个与部分字符串匹配的regexp。 我不必匹配每个部分,但至少要匹配一个(它总是会匹配) 我想要:姓名、年份和/或季节/插曲 假设我有以下字符串: i、 want.this.as.name.2014.s01e02 2010年我仍然想要一个 我也想要这个 我还是要这个.S05E23.720p.HDTV.X264 我想买这些火柴: 1. name = i.want.this.as.name. year = 2014 seasonepisode = s01e02 seas

我正在尝试创建一个与部分字符串匹配的regexp。 我不必匹配每个部分,但至少要匹配一个(它总是会匹配)

我想要:姓名、年份和/或季节/插曲

假设我有以下字符串:

  • i、 want.this.as.name.2014.s01e02
  • 2010年我仍然想要一个
  • 我也想要这个
  • 我还是要这个.S05E23.720p.HDTV.X264
  • 我想买这些火柴:

    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
    
    现在,我有一个regexp:

    (?<name>.*)(?<year>\d{4})(\s|\.|\z)*(?<seasonepisode>s(?<season>\d{1,2})e(?<episode>\d{1,2}))*
    
    (?*)(?\d{4})(\s{124;\.\ z)*(?s(?\d{1,2})e(?\d{1,2}))*
    
    但是我只在第一个字符串上得到了期望的结果。我猜这是因为字符串2、3或4中没有与完整regexp匹配的内容

    在这里,您可以尝试使用regexp:

    所以我的问题是,如何告诉regexp我不需要对所有内容都进行匹配,只需要对某些内容进行匹配?:-)我已经试着将asterix添加到opitonal中

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

    这可能有用:。使用
    /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.
    
    ^
    (?。+?)#名称:至少一个字符,非贪婪。
    (?\d{4})?#年份,可选。
    (?:#年后的东西,未捕获。
    [\s\.]
    季节。
    e(?\d\d?)#插曲。
    (?*)#其余,可选。
    )?                # 年后的东西是可选的。
    $#必须消耗整行。
    
    几点注意:

    • 名称组的非贪婪性很重要。否则,它将很高兴地消耗整个行(其他所有内容都是可选的)

    • 要求全线比赛也很重要。否则,模式将只匹配行的第一个字母(名称是非贪婪的,其他所有内容都是可选的)


    不要从尝试的正则表达式开始,更糟糕的是,不要从指向该正则表达式的链接开始。从解释你想做什么开始。将链接移到底部…效果非常好!你想让我把小额捐款寄到哪里?@MarcusBrunsten我很感激:让我们让它成为你的选择。嗯,经过一些尝试后,它似乎对我的一些数据不起作用,我真的看不出有什么区别。但请检查此示例中的最后一行:。另一方面:(sry是瑞典语)@MarcusBrunsten是的,我想知道这样一个例子。通常很难获得这些模式,因为大多数项目在所有情况下都是可选的。有时更好的策略是编写几个简单的正则表达式(每个正则表达式都没有可选元素,或者最多有一个可选元素),然后依次尝试每一个正则表达式,从最具体的正则表达式开始,以最一般的正则表达式结束。从包含所有内容的正则表达式开始(带有可选的rest组)。如果失败了,就选择名字+年份+休息。如果失败,请选择名称+年份。如果失败了,就只看名字。好吧,那太糟糕了。你是如此接近:-)无论如何,谢谢!