【问题标题】:Match group multiple times with regex使用正则表达式多次匹配组
【发布时间】:2015-04-05 23:56:09
【问题描述】:

我的目标是从文件名中获取电视节目的季节和剧集。我有以下正则表达式:

(\d{1,2})([^\d]{1,2}(\d{1,2}))+.*

仅包含一集的文件的结果与预期一致。第一个匹配组包含季节编号,第三组包含剧集编号。但我对包含多个剧集的文件有疑问。它总是只匹配一个组与剧集(最后一个),而不是全部。

也许例子胜过千言万语:

S01E01.HDTV.x264-LOL.mp4       Result: 01, 01
S01E01E02.HDTV.x264-LOL.mp4    Result: 01, 02   Expected: 01, 01, 02
S01E01-02.HDTV.x264-LOL.mp4    Result: 01, 02   Expected: 01, 01, 02
S01E01-E02.HDTV.x264-LOL.mp4   Result: 01, 02   Expected: 01, 01, 02

01x01 Lorem ipsum.avi          Result: 01, 01
01x01-02 Lorem ipsum.avi       Result: 01, 02   Expected: 01, 01, 02

1x1 Lorem ipsum.avi            Result: 1, 1
1x1-2 Lorem ipsum.avi          Result: 1, 2     Expected: 1, 1, 2

交互式示例是here

我认为问题在于我的(错误)假设,即([^\d]{1,2}(\d{1,2}))+ 中的+ 将导致多个组匹配。

顺便说一句,我使用的是 .NET,但我想这应该没关系。

【问题讨论】:

    标签: .net regex


    【解决方案1】:

    我已修复您的正则表达式以匹配您需要的部分:

    (\d{1,2})[^\d]{1,2}(\d{1,2})(?:[^\d]{1,2}(\d{1,2}))?.*
    

    在这种情况下不需要多行选项。

    见我的demo here

    C# 示例代码:

    var rx5 = new Regex(@"(\d{1,2})[^\d]{1,2}(\d{1,2})(?:[^\d]{1,2}(\d{1,2}))?.*");
    var results = rx5.Matches(str5).Cast<Match>().Select(p => p.Groups[1].Value + " - " + p.Groups[2].Value + (!String.IsNullOrEmpty(p.Groups[3].Value) ? " - " + p.Groups[3].Value : "")).ToList();
    

    输出:

    【讨论】:

    • 是的,这适用于我在这里编写的示例。但我可能对剧集数不是很具体。虽然很少见,但可能有名为 S01E02E03 的文件。因此,我想要一些可以匹配任意数量剧集的东西。
    • 我不确定你到底想匹配什么:(\d{1,2})[^\d]{1,2}(\d{1,2})(?:[^\d]{1,2}(\d{1,2}))?.* 也包括S01E02E03:它得到010203。见regex101.com/r/pE2lA9/2。或者您是否也想匹配表示剧集的字母?哪一个?如果您不提供您拥有的所有数据、确切所需的输出格式,我们将无法为您提供更好的帮助。我想我确实以这种方式而不是那种方式回答了您的问题。
    • 哦,很抱歉造成混乱。我在之前的评论中犯了一个错误。应该有S01E01E02E03。我知道我可以与另一组一起调整您的正则表达式以涵盖 3 集。但我想知道是否有办法让它独立于剧集的数量。另外,我不需要匹配字母,只需匹配数字即可。
    • 我想我可以用另一种方式来做,但现在,我认为你可以添加另一个可选组:(\d{1,2})[^\d]{1,2}(\d{1,2})(?:[^\d]{1,2}(\d{1,2}))?(?:[^\d]{1,2}(\d{1,2}))?.*regex101.com/r/pE2lA9/3。另一种解决方案需要更多的代码编写,而正则表达式将是其中最不重要的部分。
    【解决方案2】:

    我建议使用这个正则表达式,但您必须使用 .NET 过滤一些无用的匹配项。

    ([xES]|\b)(\d{1,2})
    

    这适用于同一行中灵活数量的季节或剧集。

    匹配示例:

    S01E01E02E03
    S01E01E02E03E04
    ...
    

    但是例如,给定:

    S01E01E02E03.HDTV.x264-LOL.mp4
    

    这将匹配: 01、01、02、03、26

    所以你必须编写代码来检查数字是否连续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2012-01-28
      • 2015-09-19
      • 2023-03-16
      • 2014-03-06
      • 1970-01-01
      相关资源
      最近更新 更多