繁体   English   中英

regexec 不返回多个匹配项

[英]regexec does not return multiple matches

尝试通过此示例学习 posix 正则表达式,请在此处输入链接描述以及我自己的正则表达式和文本。

    const char * regex_text = "[[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3}";
    const char * find_text = "00:01:54,644 --> 00:01:56,714 --> 00:02:58,589";

输出:

Trying to find '[[:digit:]]{2}\:[[:digit:]]{2}\:[[:digit:]]{2},[[:digit:]]{3}' in '00:01:54,644 --> 00:01:56,714 --> 00:02:58,589'
$& is '00:01:54,644' (bytes 0:12)
$& is '00:01:56,714' (bytes 17:29)
$& is '00:02:58,589' (bytes 34:46)
No more matches.

我的问题是为什么在每个for循环中只找到一个匹配项? 相反, while循环完成了这项工作。 一个regexec不应该将所有匹配项返回给m吗?

for 循环将捕获匹配项中的所有捕获组(括在括号中的组)。 所以如果你写了

([[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3}) --> ([[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3}) --> ([[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3})

作为您的正则表达式,您的三个时间戳将显示为 1 美元、2 美元和 3 美元。

但是,在您的代码中,正则表达式仅匹配一个时间戳。 如果你想捕捉下一个,你需要执行一个新的匹配,这就是while循环所做的。

为了具体回答这个问题,对regexec()的单个调用只返回正则表达式的第一个匹配项是正常的,因此需要一个外循环来遍历所有匹配项。

混淆来自这样一个事实,即regmatch_t数组只描述了正则表达式的一个匹配项(is 是一个数组,因为它必须包含匹配项本身的偏移量,以及该匹配项中每个子表达式的偏移量)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM