m3u文件如下所示:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:153741
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:11
#EXTINF:10.005333,
/ RTS_1_009 / audio / 2018- 03-16-H13 / audio- 2018-03-16-13-58-29.ts
#EXTINF:9.984000,
/ RTS_1_009 / audio / 2018-03-16-H13 / audio-2018-03-16-13-58 -39.ts
#EXTINF:10.005333,
/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-49.ts
#EXTINF:10.005333,
/ RTS_1_009 /音频/ 2018-03 -16-H13 / audio- 2018-03-16-13-58-59.ts
#EXTINF:10.005333,
/ RTS_1_009 / audio / 2018-03-16-H13 / audio-2018-03-16-13-59- 09.ts
#EXTINF:9.984000,/ RTS_1_009 / audio / 2018-03-16- H13 /
audio-2018-03-16-13-59-19.ts
我想以粗体提取对。例如:
10.005333
/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-29.ts
我设法部分解决了这个问题。以下正则表达式为我提供了持续时间(之后的数字#EXT-INF:
)
(?<=^EXTINF:)?(\d+\.\d+)(?=,\r|,\n)
但是,当我尝试在末尾添加一些内容到正则表达式时,例如^(.*)
为了捕获\ r或\ n之后的内容,我什么也没得到。我需要捕获#EXTINF:之后紧随其后的行中的所有内容。有人可以帮忙吗?
更新:
const char * const pm3u =
{
“#EXTM3U \ n”“#EXT-X-VERSION:3 \ n”
“#EXT-X-MEDIA-SEQUENCE:153741 \ n”
“”#EXT-X-ALLOW-CACHE:NO \ n“
”#EXT-X-TARGETDURATION:11 \ n“
” #EXTINF:10.005333,\ n“
” / RTS_1_009 / audio / 2018-03-16-H13 / audio-2018-03-16-13-58- 29.ts \ n“
” #EXTINF:9.984000,\ n“
” /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-39.ts\n“
” #EXTINF :10.005333,\ n“
” /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-49.ts\n“
” #EXTINF:10.005333,\ n“
” / RTS_1_009 /audio/2018-03-16-H13/audio-2018-03-16-13-58-59.ts\n“
” #EXTINF:10.005333,\ n“
”/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-59-09.ts\n“
” #EXTINF:9.984000,\ n“
“ /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-59-19.ts\n”
};int main()
{
std :: regex regExpression(“(#EXTINF:)(\\ d +。\\ d +)*”);
std :: smatch regExMatch;
const std :: string str(pm3u);
布尔b = std :: regex_match(str.begin(),str.end(),regExMatch,regExpression);
返回0;
}
如果您的正则表达式可以固定,
^
为(?:^|\n)
以匹配行的开头,而不仅仅是字符串的开头std::sregex_iterator
来匹配多个匹配项,而不是std::regex_match
仅匹配整个字符串(即模式必须匹配整个字符串)#
之前的EXTINF
字符,则因为您期望的匹配项以开头#EXTINF
。使用
const std::regex rx(R"((?:^|\n)#EXTINF:(\d+\.\d+),[\r\n]+(.*))");
std::string test = "#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-MEDIA-SEQUENCE:153741\n#EXT-X-ALLOW-CACHE:NO\n#EXT-X-TARGETDURATION:11\n#EXTINF:10.005333,\n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-29.ts\n#EXTINF:9.984000,\n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-39.ts\n#EXTINF:10.005333,\n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-49.ts\n#EXTINF:10.005333,\n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-59.ts\n#EXTINF:10.005333,\n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-59-09.ts\n#EXTINF:9.984000,\n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-59-19.ts";
for(std::sregex_iterator i = std::sregex_iterator(test.begin(), test.end(), rx);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
std::cout << "Part 1:" << m[1].str() << "\nPart 2:" << m[2].str() << std::endl;
}
正则表达式是
(?:^|\n)#EXTINF:(\d+\.\d+),[\r\n]+(.*)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句