1

番号、インとアウトのタイムコード ポイント、およびテキストのすべての行を見つける必要があります。

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!

私は現在このパターンを使用していますが、2行のテキストすべてを忘れています

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

どんな助けでも大歓迎です。

4

5 に答える 5

3

もし私があなたなら、正規表現ベースの実装から離れて、ステート マシンを見て、ファイルを 1 行ずつ見ていきます。あなたの形式は、おそらく 20 ~ 40 行のわかりやすいコードで処理できるほど単純に見えますが、合理的な正規表現には複雑すぎます。

于 2009-11-19T17:27:01.720 に答える
3

正規表現には2つの問題があると思います。1 つ目は.、末尾付近が(?<Sub>.+)改行と一致していないことです。したがって、次のように変更できます。

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

RegexOptions.Singlelineまたは、正規表現のオプションとして指定できます。このオプションが行う唯一のことは、ドットを改行に一致させることです。

2 番目の問題は、.+できるだけ多くの行に一致することです。次のように非貪欲にすることができます。

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

これは、空の行または文字列の末尾で終わるテキストの最小量と一致します。

于 2009-11-19T17:27:18.550 に答える
0

次の正規表現を使用して .srt ファイルを解析しています。

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

正規表現言語 - クイック リファレンス

于 2012-08-30T20:03:54.393 に答える
0

私は個人的に行を配列に分割し、配列をループして各行を調べ、StartTime->EndTime 行の正規表現一致を行うだけで、かなり単純なロジックを使用して前の行から Order を取得し、次の行からのテキスト (次の StartTime->Endtime を見つけるために前方を検索し、2 行をバックトラックすることによって)。

この方法で問題が少し切り刻まれるので、すべてを実行しようとする正規表現がなくなります。

于 2009-11-19T17:27:54.837 に答える
0

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]]}

ここで、「slines」は、メモリに読み込まれた字幕ファイル全体です。

于 2014-07-19T17:16:40.547 に答える