为什么这个正则表达式在 STL 世界中是错误的?

Why is this regex wrong in the STL world?

本文关键字:错误 世界 STL 正则表达式 为什么      更新时间:2023-10-16

为什么这个正则表达式在 STL 世界中是错误的?

(?<=^EXTINF:)*(d+.d+)

"?<="部分引发异常。为什么???

更新:

const char * const pm3u = { "#EXTM3U" "#EXT-X-VERSION:3"#EXT-X-MEDIA-SEQUENCE::153741\N" "#EXT-X-允许缓存:否"#EXT-X-目标持续时间: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/audio/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">
};

int main()
{
std::regex regExpression( "(#EXTINF:)(\\d+.\\d+)*" );
std::smatch regExMatch;
const std::string str( PM3U );

bool 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+),[rn]+(.*))");
std::string test = "#EXTM3Un#EXT-X-VERSION:3n#EXT-X-MEDIA-SEQUENCE:153741n#EXT-X-ALLOW-CACHE:NOn#EXT-X-TARGETDURATION:11n#EXTINF:10.005333,n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-29.tsn#EXTINF:9.984000,n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-39.tsn#EXTINF:10.005333,n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-49.tsn#EXTINF:10.005333,n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-59.tsn#EXTINF:10.005333,n/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-59-09.tsn#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+),[rn]+(.*)

在线查看此正则表达式演示。