为什么这个解析M3U的正则表达式不起作用?

马利克·乌拉克(Malik Urac)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python-为什么这个简单的正则表达式不起作用?

为什么这个正则表达式在 Vim 语法高亮中不起作用?

为什么这个积极的前瞻正则表达式'string。*?(?=)'在sed中不起作用?

为什么这个正则表达式在 powershell 中不起作用?

为什么这个正则表达式代码不起作用

为什么我的正则表达式不起作用?[Java] [正则表达式] [空白问题]

即使正则表达式可以,为什么用正则表达式替换也不起作用?

PowerShell 3正则表达式-为什么不区分大小写不起作用?

为什么此正则表达式在Notepad ++(Windows)中不起作用?

为什么我的范围正则表达式语法不起作用?

为什么标记行首的正则表达式不起作用?

为什么此正则表达式在grep中不起作用?

为什么延迟匹配在此正则表达式中不起作用?

为什么我的C ++正则表达式不起作用?

为什么带有 \[ 的正则表达式不起作用

为什么与项目标签匹配的正则表达式不起作用?

发现:为什么带有egrep的正则表达式不起作用?

为什么正则表达式在SQL Server Select语句中不起作用?

不知道为什么正则表达式不起作用

正则表达式的“非捕获”组为什么不起作用?

为什么此正则表达式不起作用?

为什么我的正则表达式在string.match()内不起作用?

无法理解为什么我的 Java 正则表达式不起作用

jQuery的正则表达式选择器不起作用。为什么?

为什么我的正则表达式组量词不起作用?

为什么此正则表达式不起作用?

为什么python正则表达式(?P = name)不起作用

为什么我更换正则表达式的时间不起作用?

为什么我的正则表达式不起作用?