Frage

Ich brauche die Nummer zu finden, die in und aus Timecode-Punkten und alle Zeilen des Textes.

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!

Ich bin dieses Muster zur Zeit verwenden, aber es vergisst alle zwei Zeilen Text

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

Jede Hilfe wäre sehr willkommen.

War es hilfreich?

Lösung

Ich denke, es gibt zwei Probleme mit dem regulären Ausdruck. Die erste ist, dass der . nahe dem Ende in (?<Sub>.+) wird newlines nicht übereinstimmen. So können Sie es ändern könnte:

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

Oder könnten Sie RegexOptions.Singleline als Option für die regex angeben. Das einzige, was die Option tut, ist das Punktspiel Zeilenumbruch machen.

Das zweite Problem besteht darin, dass .+ Streichhölzer so viele Zeilen wie möglich. Sie können es machen nicht gierige wie:

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

Dies entspricht der geringsten Menge an Text, den Enden mit einer leeren Zeile oder dem Ende der Zeichenfolge.

Andere Tipps

Wenn ich Sie wäre, würde ich von einem regex-basierte Implementierung und Blick auf eine Zustandsmaschine, zu Fuß durch die Datei Zeile für Zeile Schritt zurück. Ihr Format sieht einfach genug, um Griff mit vielleicht 20 bis 40 Zeilen einfach zu verstehen Code, aber zu komplex für einen angemessenen regex.

Ich persönlich würde die Zeilen in ein Array und Schleife durch das Array aufgeteilt, jede Zeile der Prüfung nur eine Regex für die StartTime-> EndTime Linien zu tun, dann können Sie einige ziemlich einfache Logik zu greifen Auftrag aus der vorherigen Zeile verwenden, und den Text aus Linien greifen folgende (von vor der Suche die nächsten StartTime-> Endtime und Rückzieher zwei Linien zu finden).

ich glaube, auf diese Weise das Problem auf ein wenig zerhackt, so dass man alles versuchen, keinen regulären Ausdruck zu tun haben.

Ich bin folgend regulärer Ausdruck zu parsen srt Dateien mit:

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

Regular Expression Language - Quick Reference

Ich habe diese regex in meinem Ruby-Parser:

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

, wobei „slines“ ist die ganze Untertitel-Datei lesen in den Speicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top