尝试使用此示例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
吗?
答案 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
循环所做的。