【问题标题】:Regex for matching season and episode匹配季节和剧集的正则表达式
【发布时间】:2012-08-22 22:59:59
【问题描述】:

我正在为自己制作小应用程序,我想找到与某个模式匹配的字符串,但我找不到正确的正则表达式。

Stargate.SG-1.S01E08.iNT.DVDRip.XviD-LOCK.avi

这是我拥有的字符串示例,我只想知道它是否包含 S[NUMBER]E[NUMBER] 的子字符串,每个数字最长为 2 位。

你能给我一个线索吗?

【问题讨论】:

  • 另外,请告诉我们您正在编写什么程序,如果您将其开源 - 有一个名为 theRenamer 的漂亮程序可以完成一些类似的工作,但它是一个非常繁重的程序,不是真的是独立的。 - 编辑:糟糕,TheRenamer 现在也有命令行模式。傻我! therenamer.com
  • /([Ss]?)([0-9]{1,2})([xXeE\.\-]?)([0-9]{1,2})/ - 不要忘记所有那些1x04 风格的季节/剧集 - 数字。
  • ([Ss]?)(\d{1,2})([xXeE\.\-])(\d{1,2})(没有最后一个?)更好,因为标题可以包含屏幕分辨率。

标签: c# .net regex


【解决方案1】:

正则表达式

Here 是使用命名组的正则表达式:

S(?<season>\d{1,2})E(?<episode>\d{1,2})

用法

然后,您可以像这样获得命名组(季节和剧集):

string sample = "Stargate.SG-1.S01E08.iNT.DVDRip.XviD-LOCK.avi";
Regex  regex  = new Regex(@"S(?<season>\d{1,2})E(?<episode>\d{1,2})");

Match match = regex.Match(sample);
if (match.Success)
{
    string season  = match.Groups["season"].Value;
    string episode = match.Groups["episode"].Value;
    Console.WriteLine("Season: " + season + ", Episode: " + episode);
}
else
{
    Console.WriteLine("No match!");
}

正则表达式的解释

S                // match 'S'
(                // start of a capture group
    ?<season>    // name of the capture group: season
    \d{1,2}      // match 1 to 2 digits
)                // end of the capture group
E                // match 'E'
(                // start of a capture group
    ?<episode>   // name of the capture group: episode
    \d{1,2}      // match 1 to 2 digits
)                // end of the capture group

【讨论】:

  • 谢谢 :) 这正是我一直在寻找的,使用命名组也非常好和有用
  • 我想在 IOS/Objective-c 中做同样的事情,但它没有与相同的正则表达式和输入字符串匹配。有什么建议吗?
【解决方案2】:

这里有一个很棒的在线测试站点:http://gskinner.com/RegExr/

使用它,这是您想要的正则表达式:

S\d\dE\d\d

除此之外,你还可以做很多花哨的技巧!

【讨论】:

    【解决方案3】:

    看看一些媒体软件,比如 XBMC,它们都有非常强大的电视节目正则表达式过滤器

    herehere

    【讨论】:

      【解决方案4】:

      我为 S[NUMBER1]E[NUMBER2] 输入的正则表达式是

      S(\d\d?)E(\d\d?)       // (\d\d?) means one or two digit
      

      您可以通过&lt;matchresult&gt;.group(1) 获得NUMBER1,通过&lt;matchresult&gt;.group(2) 获得NUMBER2。

      【讨论】:

        【解决方案5】:

        我想提出一个更复杂的正则表达式。我没有“。:-_” 因为我用空格替换它们

        str_replace(
                array('.', ':', '-', '_', '(', ')'), ' ',
        

        这是将标题拆分为标题季节和剧集的捕获正则表达式

        (.*)\s(?:s?|se)(\d+)\s?(?:e|x|ep)\s?(\d+)
        

        例如达芬奇的恶魔 se02ep04 和变种 https://regex101.com/r/UKWzLr/3

        我无法涵盖的唯一情况是在季节和数字之间有间隔,因为如果标题不适合我,字母 s 或 se 将成为一部分。反正我没有见过这样的案例,但它仍然是一个问题。

        编辑: 我设法用第二条线绕过它

            $title = $matches[1];
            $title = preg_replace('/(\ss|\sse)$/i', '', $title);
        

        如果名称是系列的一部分,我会删除“s”和“se”的结尾

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-10
          • 2020-05-01
          • 2013-09-22
          • 2015-03-27
          • 1970-01-01
          相关资源
          最近更新 更多