Pregunta

Necesito encontrar el número, más puntos inicial y final de código de tiempo y todas las líneas del texto.

9
00:09:48,347 --> 00:09:52,818
- Let's see... what else she's got?
- Yea... ha, ha.

10
00:09:56,108 --> 00:09:58,788
What you got down there, missy?

11
00:09:58,830 --> 00:10:00,811
I wouldn't do that!

12
00:10:03,566 --> 00:10:07,047
-Shit, that's not enough!
-Pull her back!

Actualmente estoy usando este patrón, pero se olvida de todo el texto dos líneas

(?<Order>\d+)\r\n(?<StartTime>(\d\d:){2}\d\d,\d{3}) --> (?<EndTime>(\d\d:){2}\d\d,\d{3})\r\n(?<Sub>.+)(?=\r\n\r\n\d+|$)

Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Creo que hay dos problemas con la expresión regular. La primera es que la . cerca del final en (?<Sub>.+) no coincide con saltos de línea. Por lo que podría modificarlo para:

(?<Sub>(.|[\r\n])+?)

O se podría especificar RegexOptions.Singleline como una opción para la expresión regular. Lo único que hace es la opción de hacer que las nuevas líneas de concordancia de puntos.

El segundo problema es que .+ coincide con tantas líneas como se pueda. Puede que sea no expansivo como:

(?<Sub>(.|[\r\n])+?(?=\r\n\r\n|$))

Esto coincide con la menor cantidad de texto que termina con una línea de vacío o el final de la cadena.

Otros consejos

Si yo fuera tú, me paso atrás desde una aplicación basado en expresiones regulares y miro una máquina de estados, caminando por el archivo línea por línea. Su formato es bastante simple de manejar con quizás 20-40 líneas de fácil de entender el código, pero demasiado complejo para una expresión regular razonable.

Yo personalmente dividir las líneas en una matriz y recorrer la matriz que examinan cada línea, simplemente haciendo un partido de expresiones regulares de las líneas StartTime-> EndTime, entonces se puede utilizar una lógica bastante simple para agarrar la Orden de la línea anterior, y agarrar el texto de las líneas siguientes (mediante la búsqueda por delante para encontrar la siguiente StartTime-> Fin dar marcha atrás y dos líneas).

Creo que de esta manera el problema chuletas hasta un poco para que usted no tiene una expresión expresiones regulares tratando de hacerlo todo.

Estoy utilizando la siguiente expresión regular para analizar archivos .srt:

@"(?<number>\d+)\r\n(?<start>\S+)\s-->\s(?<end>\S+)\r\n(?<text>(.|[\r\n])+?)\r\n\r\n"

lenguaje de expresiones regulares - referencia rápida

He utilizado esta expresión regular en mi analizador Ruby:

slines.scan(/(^[0-9]+)\r?\n(.*? --> .*?)\r?\n(.*?)(?=^[0-9]+\r?\n|\s+\Z)/im).map{|z| [z[0],[z[1],z[2].strip]]}

donde "slines" es todo el archivo de subtítulos lee en la memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top