最近对M3U8解析特别感兴趣,通过python脚本简单实现了解析m3u8和多线程下载之后,想用Java、Kotlin还有C/C++尝试实现。
本文主要实现使用Java的正则表达式实现简单的M3U8解析,拼合下载链接返回List。
1.读取M3U8到String这是测试用的M3U8文件
#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:17 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:15.100000, 5281440.ts #EXTINF:5.533333, 5281441.ts #EXTINF:16.666667, 5281442.ts #EXTINF:8.333333, 5281443.ts #EXTINF:8.333333, 5281444.ts #EXTINF:8.333333, 5281445.ts #EXTINF:8.333333, 5281446.ts #EXTINF:16.666667, 5281447.ts #EXTINF:8.333333, 5281448.ts #EXTINF:8.333333, 5281449.ts #EXTINF:8.333333, 52814410.ts #EXTINF:8.333333, 52814411.ts #EXTINF:16.666667, 52814412.ts #EXTINF:8.333333, 52814413.ts #EXTINF:8.333333, 52814414.ts #EXTINF:8.333333, 52814415.ts #EXTINF:8.333333, 52814416.ts #EXTINF:16.666667, 52814417.ts #EXTINF:8.333333, 52814418.ts #EXTINF:8.333333, 52814419.ts #EXTINF:8.333333, 52814420.ts #EXTINF:8.333333, 52814421.ts #EXTINF:16.666667, 52814422.ts #EXTINF:8.333333, 52814423.ts #EXTINF:8.333333, 52814424.ts #EXTINF:8.333333, 52814425.ts #EXTINF:8.333333, 52814426.ts #EXTINF:16.666667, 52814427.ts #EXTINF:8.333333, 52814428.ts #EXTINF:8.333333, 52814429.ts #EXTINF:8.333333, 52814430.ts #EXTINF:8.333333, 52814431.ts #EXTINF:16.666667, 52814432.ts #EXTINF:8.333333, 52814433.ts #EXTINF:8.333333, 52814434.ts #EXTINF:8.333333, 52814435.ts #EXTINF:8.333333, 52814436.ts #EXTINF:16.666667, 52814437.ts #EXTINF:8.333333, 52814438.ts #EXTINF:8.333333, 52814439.ts #EXTINF:8.333333, 52814440.ts #EXTINF:8.333333, 52814441.ts #EXTINF:16.666667, 52814442.ts #EXTINF:8.333333, 52814443.ts #EXTINF:4.900000, 52814444.ts #EXTINF:16.666667, 52814445.ts #EXTINF:8.333333, 52814446.ts #EXTINF:8.300000, 52814447.ts #EXTINF:4.566667, 52814448.ts #EXT-X-ENDLIST2.使用正则表达式读取
public ListReadList4M3U8String(String m3u8File) { List result = new ArrayList (); //开始筛选 Pattern pattern =Pattern.compile("n(.+?.ts)n");//匹配的模式 //通配符中也要加入转移字符 (.+?)代表要查找的内容 Matcher matcher=pattern.matcher(m3u8File); //list储存下载链接 while(matcher.find()) { String find_str = matcher.group(1); result.add(find_str); } return result; }
直接给出函数
"n(.+?.ts)n" 中n是换行符 括号代表我要取出来的内容,.+?可以表示任意字符
具体的正则表达式内容可以看看这个
Java 正则表达式-Runoob
在处理过程中,考虑到具体使用我添加了拼合字符串实现直接获得下载链接List
//使用正则表达式读文件中的文件名,通过baseUrl拼接成可以直接下载的文件Url public ListReadList4M3U8String(String m3u8File,String baseUrl) { List result = new ArrayList (); //检查baseUrl格式,是否以/结尾,防止拼接链接错误 if (baseUrl.charAt(baseUrl.length()-1) != '/') { baseUrl+="/"; } //开始筛选 Pattern pattern =Pattern.compile("n(.+?.ts)n");//匹配的模式 //通配符中也要加入转移字符 (.+?)代表要查找的内容 Matcher matcher=pattern.matcher(m3u8File); //list储存下载链接 while(matcher.find()) { String find_str = matcher.group(1); result.add(baseUrl+find_str); } return result; }


![[Java]使用正则表达式处理M3U8文件 [Java]使用正则表达式处理M3U8文件](http://www.mshxw.com/aiimages/31/269267.png)
