regexec不会返回多个匹配项

时间:2016-01-19 08:49:22

标签: regex posix

尝试使用此示例enter link description here以及我自己的正则表达式和文本来学习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吗?

1 个答案:

答案 0 :(得分:1)

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循环所做的。