解析HLS m3u8正则表达式

时间:2017-11-04 18:46:57

标签: regex hls m3u8

我正在尝试解析HLS m3u8文件,并且卡在哪里匹配m3u8链接。因此,如果URI=存在#EXT-X-I-FRAME-STREAM-INF,请使用引号中的一个,如果它不是#EXT-X-STREAM-INF,请从新行抓取链接。

文本:

#EXT-X-STREAM-INF:BANDWIDTH=263851,CODECS="mp4a.40.2, avc1.4d400d",RESOLUTION=416x234,AUDIO="bipbop_audio",SUBTITLES="subs"
gear1/prog_index.m3u8 <== new line link
#EXT-X-I-FRAME-STREAM-INF:URI="gear1/iframe_index.m3u8",CODECS="avc1.4d400d",BANDWIDTH=28451

enter image description here

正则表达式:

(?:#EXT-X-STREAM-INF:|#EXT-X-I-FRAME-STREAM-INF:)(?:BANDWIDTH=(?<BANDWIDTH>\d+),?|CODECS=(?<CODECS>"[^"]*"),?|RESOLUTION=(?<RESOLUTION>\d+x\d+),?|AUDIO=(?<AUDIO>"[^"]*"),?|SUBTITLES=(?<SUBTITLES>"[^"]*"),?|URI=(?<URI>"[^"]*"),?)*

Regex demo

1 个答案:

答案 0 :(得分:1)

您的模式的快速修复将如下所示:

  • #EXT-X-STREAM-INF部分捕获到第1组
  • 添加(?J)修饰符以允许具有相同名称的命名捕获组
  • 添加conditional construct,如果第1组匹配,将在当前模式后捕获整行。

模式看起来像

(?J)(?:(#EXT-X-STREAM-INF)|#EXT-X-I-FRAME-STREAM-INF):(?:BANDWIDTH=(?<BANDWIDTH>\d+),?|CODECS=(?<CODECS>"[^"]*"),?|RESOLUTION=(?<RESOLUTION>\d+x\d+),?|AUDIO=(?<AUDIO>"[^"]*"),?|SUBTITLES=(?<SUBTITLES>"[^"]*"),?|URI=(?<URI>"[^"]*"),?)*(?<URI>(?:(?!#EXT)\S)+))

请参阅regex demo

所以,基本上,我在最后添加了(?<URI>(?:(?!#EXT)\S)+))并在开始时抓取了(#EXT-X-STREAM-INF)

条件结构匹配如下:

  • (? - 条件构造的开始
    • (1) - 如果第1组匹配
    • \R - 换行符
    • (?<URI> - 启动指定的捕获组
      • (?:(?!#EXT)\S)+) - 任何非空白字符(\S),1次或多次出现(+),它不是#EXT字符序列的起始字符(所谓的"tempered greedy token"
    • ) - 指定捕获组的结尾
  • ) - 条件构造的结束