Programim dhe zhvillim, javascript, python, php, html

Analizimi i skedarit HLS m3u8 duke përdorur shprehje të rregullta

Unë dua të analizoj skedarin HLS master m3u8 dhe të marr gjerësinë e brezit, rezolucionin dhe emrin e skedarit prej tij. Aktualisht po përdor analizimin e vargjeve për të kërkuar vargun për disa modele dhe bëj vargun e nënvargut për të marrë vlerën.

Shembull i skedarit:

#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

Por kuptova se mund ta analizojmë duke përdorur shprehje të rregullta siç përmenden në këtë pyetje: Problemi që përputhet me regex model në Android

Unë nuk kam ndonjë ide të shprehjes së rregullt, kështu që mund të më udhëzojë dikush që ta analizoj këtë duke përdorur shprehje të rregullta.

Ose mund të më ndihmojë dikush që të shkruaj regexp për analizimin e vlerave BANDWIDTH dhe RESOLUTION nga vargu i poshtëm

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

Përgjigjet:


1

Mund të provoni diçka të tillë:

    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);
    }

Do të vendosë gjerësinë e brezit dhe rezolucionin në vlerat e sakta (String).

Nuk e kam provuar këtë në një pajisje ose emulator android, por duke gjykuar nga lidhja që dërgove dhe API-ja e androidit, duhet të funksionojë njësoj si java e vjetër e mësipërme.

Regex përputhet me vargjet që fillojnë me #EXT-X-STREAM-INF: dhe përmban BANDWIDTH dhe RESOLUTION të ndjekur nga formatet e sakta të vlerave. Këto më pas referohen prapa në grupin e referencës 1 dhe 2, në mënyrë që ne t'i nxjerrim ato.

Redakto:

Nëse RESOLUTION nuk është gjithmonë i pranishëm, atëherë mund ta bëni atë pjesë opsionale si të tillë:

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

Vargu resolution do të ishte null në rastet kur është i pranishëm vetëm BANDWIDTH.

Redakto2:

? i bën gjërat opsionale, dhe (?:___) do të thotë një grup pasiv (në krahasim me një grup referues prapa (___). Pra, është në thelb një grup pasiv opsional. Pra, po, çdo gjë brenda tij do të jetë opsionale.

Një . përputhet me një karakter të vetëm, dhe një * do të thotë se do të përsëritet zero ose më shumë herë. Pra, .* do të përputhet me zero ose më shumë karaktere. Arsyeja pse na duhet kjo është që të konsumojmë çdo gjë midis asaj që po përputhemi, p.sh. çdo gjë ndërmjet #EXT-X-STREAM-INF: dhe BANDWIDTH. Ka shumë mënyra për ta bërë këtë, por .* është më e përgjithshme/e gjerë.

\d është në thelb një grup karakteresh që përfaqësojnë numrat (0-9), por meqenëse e përcaktojmë vargun si një varg Java, na duhet dyfishi \\, përndryshe përpiluesi Java do të dështojë sepse nuk e njeh karakterin e arratisur \d (në Java) . Në vend të kësaj, ai do të analizojë \\\ në mënyrë që të marrim \d në vargun përfundimtar të kaluar te konstruktori Pattern.

[\dx]+ do të thotë një ose më shumë karaktere (+) nga karakteret 0-9 dhe x. [\dx\d] do të ishte një karakter i vetëm (jo +) nga i njëjti grup karakteresh.

Nëse jeni të interesuar për regex, mund të shikoni regular-expressions.info ose/dhe < një href="http://regexone.com/" rel="noreferrer">regexone.com, aty do të gjeni përgjigje shumë më të thella për të gjitha pyetjet tuaja.

07.03.2013
  • Faleminderit për përgjigjen do të provoj kodin tuaj. Unë kam një pyetje në lidhje me përputhjen e modelit kur ne thërrasim pattern.matcher çfarë saktësisht kthen në matcher a është vargu që e lë patentën e dhënë në shprehjen e rregullt? pasi kemi bërë pattern.matcher pse po thërrasim find? 07.03.2013
  • Përputhësi është një objekt që përdorni për të kryer operacione të përputhjes në vargun e dhënë bazuar në model. Kur telefononi find() do të përpiqet të gjejë përputhjen e radhës në vargun e dhënë, nëse gjen një, ai kthehet i vërtetë dhe ne mund ta nxjerrim rezultatin. Mund t'i hidhni një sy dokumentacioni për më shumë informacion (ky është dokumentacioni Java, por duhet të sillet në të njëjtën mënyrë në Android, dokumenti android nuk kishte shumë detaje në të). 07.03.2013
  • faleminderit për shpjegimin! Unë e lidha kodin tuaj ai po funksionon, por në rast se vargu nuk ka RESOLUCION në të dhe vetëm gjerësi bande atëherë? E provova por find po dështon në atë rast. a mund të jetë e mundur të kontrollohet për RESOLUTION në secilin rast nëse gjendet, atëherë në rregull, përndryshe thjesht injoro ose duhet të kemi shprehje të veçanta për analizimin e gjerësisë së brezit dhe rezolucionit dhe t'u kalojmë të njëjtin varg të dyve dhe të thërrasim gjetjen? 07.03.2013
  • Shih redaktimin tim :) Për sa kohë që vetëm RESOLUTION është opsionale, është e drejtë përpara, nëse keni raste pa BANDWIDTH, por me RESOLUTION, atëherë bëhet pak më e ndërlikuar, por duhet të jetë ende e mundur. 07.03.2013
  • Faleminderit për përditësimin po funksionon. Diçka ndërmjet (?:___)? do të jetë fakultative apo jo? dhe gjithashtu për çfarë përdoret .* dhe pse \\ dhe gjithashtu pse është [\\dx]+ dhe jo [\\dx\\d] më falni nëse po bëj kaq shumë pyetje :) më falni për këtë. 07.03.2013
  • Përditësova përgjigjen time për të përfshirë pyetjet tuaja më të fundit. 07.03.2013
  • Faleminderit për shpjegimin e mrekullueshëm, nuk mund të bëhet më mirë se ky faleminderit. duke përdorur hyrjet e dhëna nga ju, u përpoqa të shkruaj një regexp për analizimin e numrit nga ky varg #EXTINF:10, no desc. regexp im është si ^#EXTINF:(\\d+),$ por matcher.find() im është gjithmonë false në këtë rast, a është e drejtë regexp im? 08.03.2013
  • le të të vazhdojmë këtë diskutim në chat 08.03.2013

  • 2

    Kuptova se kjo mund të jetë ndihmë.
    http://sourceforge.net/projects/m3u8parser/(Licenca: LGPLv3)

    28.12.2015

    3

    ju thjesht mund të ndani vargjet, ja çfarë dua të them në 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]
    
    26.03.2021
    Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..