我正在尝试匹配并打破一个典型的电视洪流的标题:
MyTV.Show.S09E01.HDTV.XviD
MyTV.Show.S10E02.HDTV.XviD
MyTV.Show.901.HDTV.XviD
MyTV.Show.1102.HDTV.XviD
我试图将这些字符串分成3个捕获组,每个条目:Title,Season,Episode.
我可以轻松处理前2个:
^([a-zA-Z0-9.]*)\.S([0-9]{1,2})E([0-9]{1,2}).*$
Run Code Online (Sandbox Code Playgroud)
然而,第三和第四个证明很难打破季节和插曲.如果我可以倒退,那会更容易.例如,对于"901",如果我可以向后工作,则将第一个数字作为数字编号,在此之前剩余的任何数字是季节数.
有没有人知道如何将这些字符串分解为相关的捕获组?
Nul*_*ion 15
这是我会用的:
(.*?)\.S?(\d{1,2})E?(\d{2})\.(.*)
Run Code Online (Sandbox Code Playgroud)
有捕获组:
1: Name
2: Season
3: Episode
4: The Rest
Run Code Online (Sandbox Code Playgroud)
using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
string s = @"MyTV.Show.S09E01.HDTV.XviD
MyTV.Show.S10E02.HDTV.XviD
MyTV.Show.901.HDTV.XviD
MyTV.Show.1102.HDTV.XviD";
Extract(s);
}
private static readonly Regex rx = new Regex
(@"(.*?)\.S?(\d{1,2})E?(\d{2})\.(.*)", RegexOptions.IgnoreCase);
static void Extract(string text)
{
MatchCollection matches = rx.Matches(text);
foreach (Match match in matches)
{
Console.WriteLine("Name: {0}, Season: {1}, Ep: {2}, Stuff: {3}\n",
match.Groups[1].ToString().Trim(), match.Groups[2],
match.Groups[3], match.Groups[4].ToString().Trim());
}
}
}
Run Code Online (Sandbox Code Playgroud)
生产:
Name: MyTV.Show, Season: 09, Ep: 01, Stuff: HDTV.XviD
Name: MyTV.Show, Season: 10, Ep: 02, Stuff: HDTV.XviD
Name: MyTV.Show, Season: 9, Ep: 01, Stuff: HDTV.XviD
Name: MyTV.Show, Season: 11, Ep: 02, Stuff: HDTV.XviD
Run Code Online (Sandbox Code Playgroud)
我见过的几乎所有来自 torrent 的媒体文件都有两位数的剧集。有了这个,你应该能够做到E([0-9]{2}).
这一点并让表达式匹配。
我估计 99.9% 的节目都标有两位数的剧集。如果您尝试编写一个脚本来轻松标记自己的节目,我会采用两位数的剧集假设,并手动重命名您遇到的错误标记文件。如果您尝试编写一些供公众使用的东西,您可能需要考虑更多的语法。我过去曾见过其他应用程序尝试过这种做法,而且所有应用程序的效果都一般。这是一个可能没有单一解决方案的难题。
归档时间: |
|
查看次数: |
4399 次 |
最近记录: |