2010-09-27 33 views
5

estoy tratando de igualar y romper un típico título del torrente tv:¿Cómo puedo escribir una expresión regular para que coincida con el formato de título de torrents?

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

estoy tratando de romper estas cadenas hasta en 3 grupos de captura para cada entrada: Título, Estación, episodio.

puedo manejar los 2 primeros bastante fácil:

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

Sin embargo, el tercer y cuarto resultar difícil de romper la temporada y episodio. Si pudiera trabajar al revés, sería más fácil. Por ejemplo, con "901", si pudiera trabajar hacia atrás sería tomar el primero en dígitos como el número del episodio, todo lo que quede antes de ese es el número de la temporada.

¿Alguien tiene alguna sugerencia sobre cómo puedo dividir estas cadenas en esos grupos de captura relevantes?

+5

Esto es ambiguo. ¿Interpreto '102' como' S1E02' o 'S10E2'? – NullUserException

+0

@Null Este es un punto muy válido, por lo que en mi respuesta mencioné el hecho de que nunca he visto un torrente publicado con un solo dígito para su número de episodio. Creo que por el bien de la cordura verificando todo, es bastante seguro suponer que '102' es S01E02. –

+0

¿Qué sucede si suponemos que está en el formato de número único, que los últimos 2 dígitos son episodio y el primer dígito es la temporada? – KingNestor

Respuesta

2

Casi todos los archivos de medios que he visto que provienen de un torrente tienen episodios de dos dígitos. Con eso, deberías poder hacer E([0-9]{2}). y obtener la expresión para que coincida.

Estimo que el 99.9% de los espectáculos están marcados con episodios de dos dígitos. Si intentas escribir un guión para etiquetar fácilmente tus propios programas, elegiría el episodio de dos dígitos y cambiaría el nombre de los archivos erróneos que encuentres. Si intenta escribir algo para el consumo público, probablemente tenga un lote más sintaxis que deberá tener en cuenta. He visto esto probado por otras aplicaciones en el pasado, y todas han funcionado exactamente así. Es un problema difícil que probablemente no tiene una solución única.

+0

su muestra de expresiones regulares que ha publicado se dirige a la parte con la que no tengo ningún problema.Cuando las letras 'S' y 'E' están presentes, no tengo problemas. Estoy buscando ayuda con el formato cuando no están allí. – KingNestor

+0

@King - Lo siento: he estado editando mi publicación para abordar sus inquietudes con mayor precisión, probablemente cuando ya estaba comentando. ¿Mi actualización ayuda más? –

15

Esto es lo que yo usaría:

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

tiene grupos de captura:

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

Aquí hay algo de código en C# (cortesía de 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()); 
     } 
    } 

} 

Produce:

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

Interesante, pensé que (\ d {1,2}) trataría con avidez de hacer coincidir 2 dígitos, ya que técnicamente 2 estaban disponibles. – KingNestor

+0

@KingNestor No lo hará porque no podría coincidir con el '\ d {2}' que viene después. – NullUserException

+0

Entonces, en su proceso de coincidencia, ¿intenta primero hacer coincidir 2 y luego retroceder más tarde para intentar hacer coincidir 1? – KingNestor

Cuestiones relacionadas