4

HLS マスター m3u8 ファイルを解析し、そこから帯域幅、解像度、およびファイル名を取得したいと考えています。現在、文字列解析を使用していくつかのパターンの文字列を検索し、部分文字列を実行して値を取得しています。

サンプルファイル:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=476416,RESOLUTION=416x234
Stream1/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=763319,RESOLUTION=480x270
Stream2/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1050224,RESOLUTION=640x360
Stream3/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1910937,RESOLUTION=640x360
Stream4/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3775816,RESOLUTION=1280x720
Stream5/index.m3u8

しかし、この質問で言及されているように、正規表現を使用して解析できることがわかりました: Android で正規表現パターンに一致する問題

正規表現のアイデアがないので、正規表現を使用してこれを解析するように案内してください。

または、文字列の下から BANDWIDTH および RESOLUTION 値を解析するための正規表現を書くのを誰かが手伝ってくれますか

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=476416,RESOLUTION=416x234
4

4 に答える 4

10

次のようなことを試すことができます:

    final Pattern pattern = Pattern.compile("^#EXT-X-STREAM-INF:.*BANDWIDTH=(\\d+).*RESOLUTION=([\\dx]+).*");

    Matcher matcher = pattern.matcher("#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=476416,RESOLUTION=416x234");
    String bandwidth = "";
    String resolution = "";

    if (matcher.find()) {
        bandwidth = matcher.group(1);
        resolution = matcher.group(2);
    }

帯域幅と解像度を正しい (文字列) 値に設定します。

Android デバイスまたはエミュレーターでこれを試したことはありませんが、送信したリンクと Android API から判断すると、上記のプレーンな古い Java と同じように動作するはずです。

正規表現は、 で始まり、#EXT-X-STREAM-INF:を含みBANDWIDTHRESOLUTIONその後に正しい値形式が続く文字列に一致します。これらは、後方参照グループ 1 および 2 で後方参照されるため、それらを抽出できます。

編集:

RESOLUTION が常に存在するとは限らない場合は、その部分をオプションにすることができます。

"^#EXT-X-STREAM-INF:.*BANDWIDTH=(\\d+).*(?:RESOLUTION=([\\dx]+))?.*"

resolution文字列は、nullのみが存在する場合になりますBANDWIDTH

編集2:

?物事をオプションにし(?:___)、パッシブグループを意味します(後方参照グループとは対照的に(___)。つまり、基本的にオプションのパッシブグループです。そうです、その中のものはすべてオプションになります.

a.は 1 文字に一致し、a*はそれが 0 回以上繰り返されることを意味します。その.*ため、0 個以上の文字に一致します。#EXT-X-STREAM-INF:これが必要な理由は、一致するものの間のもの、たとえばとの間のものを消費するためBANDWIDTHです。これを行うには多くの方法がありますが.*、最も一般的/広範な方法です。

\dは基本的に数字を表す文字のセット ( 0-9) ですが、文字列を Java 文字列として定義するため、 double が必要です。そうしないと、エスケープ文字(Java で) を\\認識しないため、Java コンパイラは失敗します。\d代わりに、コンストラクターに渡された最終的な文字列を取得できるように解析\\します。\\dPattern

[\dx]+は、 および のうちの 1 つまたは複数の文字 ( +) を意味0-9xます。は、同じ文字セットの[\dx\d]1 文字 (no ) になります。+

正規表現に興味がある場合は、 regular-expressions.infoまたはregexone.comをチェックしてください。すべての質問に対するより詳細な回答が見つかります。

于 2013-03-07T08:29:30.203 に答える
1

文字列を分割することもできます。これがPythonでの意味です。

fu ="#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=476416,RESOLUTION=416x234"

for chunk in fu.split(':')[1].split(','):
    if chunk.startswith('BANDWIDTH'):
        bandwidth = int(chunk.split('=')[1])
    if chunk.startswith('RESOLUTION'):
        resolution = chunk.split('=')[1]
于 2021-03-26T18:47:07.580 に答える