0

文字列に特定の値があるかどうかを確認する必要がある場合、正規表現はどのようになりますか

たとえば、次の文字列から Duration 量 (タイムスパン) を抽出する必要がありますが、ソース文字列にすべてのDuration,startおよびbitrate部分文字列が完全に含まれている場合に限ります

Duration: 00:04:19.39, start: 0.157967, bitrate: 15636 kb/s

次のような行は無視する必要があります。

Duration: 00:04:19.39, bitrate: 15636 kb/s
start: 0.157967, bitrate: 15636 kb/s
Duration: 00:04:19.39, start: 0.157967
4

3 に答える 3

2

あなたはデータ抽出を行っているので、次の単純な正規表現を使用します。

^(?=.*start:)(?=.*bitrate:).*Duration: ([\d.:]+)

タイムスタンプは、最初のキャプチャ グループにあります。

データはプログラムログから生成されているようですので、間隔は規則的だと思います。start私の正規表現は、ソース文字列のbitrateとの順序を無視します。Duration大文字と小文字を区別しない一致が必要な場合は、フラグをオンにします。

順序付けを無視すると、長い文字列で正規表現が遅くなります。(特に順序について) 仮定が多ければ多いほど、正規表現は優れたものになります。

説明

^
(?=.*start:)
(?=.*bitrate:)
.*Duration: ([\d.:]+)

^文字列の先頭を固定します。正規表現エンジンがすべてのケースを徹底的にバックトラックし、一致が見つからない場合、一致をチェックする必要がないため、パフォーマンス上の理由からこれを追加しました。

(?=.*start:)ゼロ幅の正の先読み。文字列の現在の位置から照合を試み.*start:、見つかった場合は中断した位置から照合を続行し、見つからない場合は停止します。正規表現のこの部分とは対照的に、実際には文字列を消費しないため、ゼロ幅と呼ばれます.*Duration: ([\d.:]+)

(?=.*bitrate:)、上記と同じようbitrate:に、文字列内に前方があるかどうかをチェックします。

.*Duration: ([\d.:]+)実際の期間と一致します。あなたが得たものは何でも正しいと仮定するので、私はフォーマットを気にし\dませ.:.

文字を消費するという概念は、文字列に複数の一致がある場合に重要です。アクションを決定する前に、文字列に特定のシーケンスが含まれているかどうかを事前に確認したい場合があります。現在の位置でテキストを処理していない場合は、先にテキストを処理するべきではないため、そのようなチェックはcharacter を消費すべきではありません。テキストを消費すると、現在の位置から文字列内の前方のテキストまでのテキストの一致が失われる可能性があります。

于 2013-03-01T17:40:23.413 に答える
2

必要なのは、文字列全体に一致し、抽出する部分のキャプチャ グループを持つ式です。次のようなものです。

@"Duration: (\d{2}:\d{2}:\d{2}.\d{2}), start: \d+(.\d+)?, bitrate: \d+ kb/s"

()一致するグループ (Duration読み取りたい値)をエンベロープします。

于 2013-03-01T17:40:23.683 に答える
0

フォーマットと順序が常に同じである場合、シンプレックス正規表現は次のようになります。

Duration: (.*), start: .*, bitrate: .*
于 2013-03-01T17:47:56.700 に答える