5

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

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

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

你能给我一个线索吗?

4

5 回答 5

10

正则表达式

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

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
于 2012-08-23T07:12:30.783 回答
2

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

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

S\d\dE\d\d

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

于 2012-08-22T23:05:50.597 回答
0

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

这里这里

于 2012-08-22T23:08:14.477 回答
0

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

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

您可以获得<matchresult>.group(1)NUMBER1 和 NUMBER2 <matchresult>.group(2)

于 2012-08-23T04:49:56.343 回答
0

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

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”的结尾

于 2020-03-25T09:27:47.290 回答