2016-11-30 3 views
1

Ich habe einen Text/Untertitel-Datei wie folgt:Regex, um eine Linie beginnend mit der Ziffer übereinstimmen nur, wenn die gleiche Linie Alphabete enthält später

1 
00:00:58,178 --> 00:00:59,327 
Some text! 

2 
00:00:59,329 --> 00:01:01,819 
<i>Some text</i> 

3 
00:01:40,512 --> 00:01:41,629 
2350 some text. 

4 
00:01:41,631 --> 00:01:43,771 
Some text. 

Jetzt habe ich fast herausgefunden, wie die aktuelle Untertitelzeile übereinstimmen von unten regex:

^([^\d^\n].*) 

Aber was, wenn die gleiche tatsächliche Untertitelzeile beginnt mit der Ziffer (dritten Untertitel in Beispiel)? Also muss ich jetzt auch die Zeilen, die mit Ziffern beginnen, nur dann abgleichen, wenn sie später Alphabets in derselben Zeile vor der Zeilenendung haben.

Wie kann ich das tun, indem ich meine oben verwendete Regex kombiniere?

+0

Was passiert, wenn die Untertitelzeile nur eine Nummer? Versuchen Sie auch diesen Ansatz: [^^(?! \ D + $ | \ d {2}: \ d {2}: \ d {2}, \ d + -> \ d {2}: \ d {2} : \ d {2}, \ d + $). + '] (https://regex101.com/r/dPTc6v/2) –

+0

Kann der Text auch Doppelpunkte enthalten? Wie 'Some: text'? – sigil

+0

Gut für diesen Fall (Susbitle beginnend mit Nummer) Ich kann es ignorieren, wie Regex wird auch mit Untertitel Seriennummern kollidieren.Die Chancen einer tatsächlichen Untertitelzeile, die nur Zahlen enthält, sind im Vergleich zur gesamten Untertiteldatei sehr niedrig, aber wenn dies vermieden werden kann, wird es definitiv ein Best Case/Idealfall sein. –

Antwort

2

Update # 1

Dieses Update wird eine riesige Leistungssteigerung

I Untertitel nehme an, in mehreren Zeilen sein können zu bringen:

^\d+:\d+:[^-]+-->.*\R+\K.+(?:\R.+)*(?=\s*(?:^\d+$|\z)) 

Erläuterung:

Live demo

+0

Danke für die tolle Antwort, aber diese Regex passt auch zu der Newline (die als Partition zwischen den Untertiteln dient) nachdem der Inhalt vorbei ist, kann das irgendwie vermieden werden? –

+1

Das macht diese Antwort die perfekte bei weitem vielen Dank, ich denke, das wird mit irgendwelchen hässlichen Untertiteldateien funktionieren, mit denen ich auch in der Zukunft arbeiten werde. Selbst wenn Sie Verbesserungen finden, können Sie sie gerne weiter verbessern. Übrigens, wenn Sie diese Frage für würdig halten, können Sie sie gern aufwerten. –

+1

Das Abstimmen der vorherigen Zeile ist eine gute Idee, weil es Zeilen verbraucht, die ausgeschlossen werden müssen. Da diese Art von Datei immer die gleiche Struktur hat und jeder Block mit einer leeren Zeile endet, können Sie sogar den Luxus haben, ausweichender zu sein: '^ \ d +:. * \ R \ K. + (?: \ R. +) * ' –

1

schlage ich einen Ansatz, der in ignorieren alle Linien besteht, die nur Zahlen sind oder gleich dem SRT-Zeitstempel Zeitraum:

^(?!\d+$|\d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+$).+ 

Siehe this regex demo

Einzelheiten:

  • ^ - Beginn einer Linie
  • (?! - Beginn des negativen Look-Ahead, die das Spiel nicht, wenn ein Muster unmittelbar rechts zu finden ist:
    • \d+$ - 1+ Ziffern bis zum Ende der Zeile
    • | - oder
    • \d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+$ - die --> getrennten Zeitstempel
  • ) - Ende des Vorgriffs-
  • .+ - Spiel t er ganze nicht-leere Zeile
+0

Das ist eine großartige Antwort, vielen Dank. Bitte löschen Sie es nicht, Sie können es gerne bearbeiten/verbessern. –

+0

Ich sehe, dass Sie eine genauere Regex bevorzugen. Beachten Sie, dass revo's Regex das faule Punkt-Matching-Muster verwendet (Sie brauchen '[\ s \ S]' nicht, wenn Sie es durch '.' ersetzen und einen DOTALL-Modifikator verwenden), der zusammen mit einem Lookahead am Ende eine Ressource ist verbrauchendes Muster. Benutze ['^ \ d +: \ d +: [^ -] + ->. * \ R \ K + (?: \ R (?! \ D + $). *) *'] (Https: // www .regex101.com/r/jWOqAq/4). Beachten Sie, dass der Schrittbetrag mit dieser Version 4 Mal reduziert wird. Eigentlich würde ich lieber einen ausführlicheren Teil bevorzugen, der mit dem Zeitstempel übereinstimmt ('\ d {2}: \ d {2}: \ d {2}, \ d + -> \ d {2}: \ d {2} : \ d {2}, \ d + $ '). –

+0

Beachten Sie auch, dass die '[^ -]' einem Zeilenumbruch entsprechen, also sollten Sie es durch '[^ - \ r \ n]' ersetzen. –

Verwandte Themen