解析 HLS m3u8 正则表达式

Parsing HLS m3u8 Regex

我正在尝试解析 HLS m3u8 文件,我卡在的地方是匹配 m3u8 links。因此,如果 URI= 存在,则从 #EXT-X-I-FRAME-STREAM-INF 中获取引号中的那个,如果不存在 #EXT-X-STREAM-INF,则从新行中获取 link。

正文:

#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

正则表达式:

(?:#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

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

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

图案看起来像

(?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 字符的起始字符序列(所谓的
    • ) - 命名捕获组结束
  • ) - 条件构造结束