あなたはデータ抽出を行っているので、次の単純な正規表現を使用します。
^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+)
タイムスタンプは、最初のキャプチャ グループにあります。
データはプログラムログから生成されているようですので、間隔は規則的だと思います。start
私の正規表現は、ソース文字列のbitrate
との順序を無視します。Duration
大文字と小文字を区別しない一致が必要な場合は、フラグをオンにします。
順序付けを無視すると、長い文字列で正規表現が遅くなります。(特に順序について) 仮定が多ければ多いほど、正規表現は優れたものになります。
説明
^
(?=.*start:)
(?=.*bitrate:)
.*Duration: ([\d.:]+)
^
文字列の先頭を固定します。正規表現エンジンがすべてのケースを徹底的にバックトラックし、一致が見つからない場合、一致をチェックする必要がないため、パフォーマンス上の理由からこれを追加しました。
(?=.*start:)
ゼロ幅の正の先読み。文字列の現在の位置から照合を試み.*start:
、見つかった場合は中断した位置から照合を続行し、見つからない場合は停止します。正規表現のこの部分とは対照的に、実際には文字列を消費しないため、ゼロ幅と呼ばれます.*Duration: ([\d.:]+)
。
(?=.*bitrate:)
、上記と同じようbitrate:
に、文字列内に前方があるかどうかをチェックします。
.*Duration: ([\d.:]+)
実際の期間と一致します。あなたが得たものは何でも正しいと仮定するので、私はフォーマットを気にし\d
ませ.
ん:
.
文字を消費するという概念は、文字列に複数の一致がある場合に重要です。アクションを決定する前に、文字列に特定のシーケンスが含まれているかどうかを事前に確認したい場合があります。現在の位置でテキストを処理していない場合は、先にテキストを処理するべきではないため、そのようなチェックはcharacter を消費すべきではありません。テキストを消費すると、現在の位置から文字列内の前方のテキストまでのテキストの一致が失われる可能性があります。