我正在尝试解析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
正则表达式:
(?:#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>"[^"]*"),?)*
答案 0 :(得分:1)
您的模式的快速修复将如下所示:
#EXT-X-STREAM-INF
部分捕获到第1组(?J)
修饰符以允许具有相同名称的命名捕获组模式看起来像
(?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"))
- 指定捕获组的结尾)
- 条件构造的结束