2010-09-27 7 views
5

Ich versuche, eine typische TV torrent Titel zu passen und brechen:Wie kann ich eine Regex schreiben, die einem Torrents-Titelformat entspricht?

MyTV.Show.S09E01.HDTV.XviD
MyTV.Show.S10E02.HDTV.XviD
MyTV.Show.901 .HDTV.XviD
MyTV.Show.1102.HDTV.XviD

ich versuche, diese Strings bis zu 3-Capture-Gruppen für jeden Eintrag zu brechen: Titel, Staffel, Folge.

kann ich die ersten 2 leicht genug handhaben:

^([a-zA-Z0-9.]*)\.S([0-9]{1,2})E([0-9]{1,2}).*$ 

jedoch die dritten und vierten als schwierig erweisen, die Saison und Folge auseinander zu brechen. Wenn ich rückwärts arbeiten könnte, wäre es einfacher. Zum Beispiel, mit "901", Wenn ich rückwärts arbeiten könnte, würde ich die ersten Ziffern als Episodennummer nehmen, alles was davor ist ist die Jahreszeitnummer.

Hat jemand irgendwelche Tipps, wie ich diese Strings in diese relevanten Erfassungsgruppen aufteilen kann?

+5

Dies ist mehrdeutig. Interpretiere ich '102' als' S1E02' oder 'S10E2'? – NullUserException

+0

@Null Dies ist ein sehr stichhaltiger Punkt, weshalb ich in meiner Antwort darauf hingewiesen habe, dass ich noch nie einen Torrent gesehen habe, der mit einer einzigen Ziffer für seine Folgenummer veröffentlicht wurde. Ich denke, um der Vernunft willen, alles zu überprüfen, ist es sicher genug, anzunehmen, dass 102 S01E02 ist. –

+0

Was ist, wenn wir davon ausgehen, dass es sich nur um das Zahlenformat handelt, dass die letzten zwei Ziffern Folge sind und die erste Ziffer die Jahreszeit ist? – KingNestor

Antwort

2

Fast jede Mediendatei, die ich jemals gesehen habe, die von einem Strom kam, hatte zweistellige Episoden. Damit können Sie stattdessen E([0-9]{2}). ausführen und den Ausdruck passend finden.

Ich würde schätzen, 99,9% der Shows sind mit zweistelligen Folgen markiert. Wenn Sie versuchen, ein Skript zu schreiben, mit dem Sie Ihre eigenen Shows einfach beschriften können, würde ich die zweistellige Episode annehmen und die Dateien, die Sie übersehen haben, manuell umbenennen. Wenn Sie versuchen, etwas für den öffentlichen Verbrauch zu schreiben, haben Sie wahrscheinlich eine Los weitere Syntaxen, die Sie beachten müssen. Ich habe gesehen, dass dies in der Vergangenheit durch andere Anwendungen versucht wurde, und alle haben einfach so funktioniert. Es ist ein schweres Problem, das wahrscheinlich keine einzige Lösung hat.

+0

Ihr Regex-Beispiel, das Sie gepostet haben, adressiert den Teil, mit dem ich kein Problem habe.Wenn die Buchstaben "S" und "E" vorhanden sind, habe ich keine Probleme. Ich suche nach Hilfe mit dem Format, wenn sie nicht da sind. – KingNestor

+0

@King - Entschuldigung - Ich habe meinen Beitrag bearbeitet, um Ihre Bedenken besser zu adressieren, wahrscheinlich, als Sie bereits kommentiert haben. Hilft mein Update weiter? –

15

Hier ist, was ich verwenden würde:

(.*?)\.S?(\d{1,2})E?(\d{2})\.(.*) 

Hat Einfanggruppen:

1: Name 
2: Season 
3: Episode 
4: The Rest 

Hier einige Code in C# (mit freundlicher Genehmigung von this post): see it live

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()); 
     } 
    } 

} 

Erzeugt:

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 
+0

Interessant, ich würde denken, dass (\ d {1,2}) von gierig versucht, 2 Ziffern zu entsprechen, da technisch 2 verfügbar waren. – KingNestor

+0

@KingNestor Es wird nicht, denn dann würde es nicht mit dem '\ d {2}' übereinstimmen, das danach kommt. – NullUserException

+0

Also, in seinem Prozess des Abgleichens, versucht es zuerst, Match 2 und dann Backtrack später zu versuchen, 1 zu entsprechen? – KingNestor

Verwandte Themen