Question

Je dois trouver le numéro, le et les points de timecode et toutes les lignes du texte.

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!

J'utilise actuellement ce modèle, mais il oublie tout le texte de deux lignes

(?<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+|$)

Toute aide serait très apprécié.

Était-ce utile?

La solution

Je pense qu'il ya deux problèmes avec l'expression régulière. La première est que le . près de l'extrémité en (?<Sub>.+) ne correspond pas à des sauts de ligne. Ainsi, vous pouvez le modifier à:

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

Ou vous pouvez spécifier RegexOptions.Singleline en option à la regex. La seule chose que l'option n'est faire les sauts de ligne match de points.

Le deuxième problème est que .+ correspond à autant de lignes que possible. Vous pouvez comme non-gourmand faire:

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

correspond au moins quantité de texte qui se termine par une ligne vide ou à la fin de la chaîne.

Autres conseils

Si je vous, je pas en arrière d'une implémentation basée sur regex et regarde une machine d'état, la marche à travers la ligne de fichiers en ligne. Votre format semble assez simple à manipuler avec peut-être 20-40 lignes de code facile à comprendre, mais trop complexe pour une regex raisonnable.

Personnellement, je diviser les lignes dans un tableau et une boucle à travers le réseau examinant chaque ligne, juste faire un match de regex pour les StartTime-> lignes EndTime, vous pouvez utiliser une logique assez simple à saisir ordre de la ligne précédente, et saisir le texte des lignes suivantes (en effectuant une recherche avant de trouver la prochaine StartTime-> Endtime et retours en arrière deux lignes).

Je pense que cette façon côtelettes le problème un peu afin que vous ne disposez pas d'une expression regex essayer de tout faire.

J'utilise l'expression suivante régulière pour analyser les fichiers .srt:

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

Langue Regular Expression - Référence rapide

J'ai utilisé cette expression régulière dans mon analyseur 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]]}

où « slines » est le tout fichier sous-titre lu dans la mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top