使用这个正则表达式,我想匹配带有或不带有毫秒 (ms) 字段的时间。为了完整起见,我在这里编写了正则表达式(我删除了 regex101 中的锚点以启用多行):
^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:|(?:\.)([0-9]{1,6}))$
我有点不明白这个的 C++ 行为。现在您在 regex101 中看到,捕获组的数量取决于字符串。如果没有 ms,则为 3+1(因为 C++ 使用 match[0] 作为匹配模式),如果有 ms,则为 4+1。但是在这个例子中:
std::regex timeRegex = std::regex(R"(^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:|(?:\.)([0-9]{1,6}))$)");
std::smatch m;
std::string strT = std::string("12:00:09");
bool timeMatch = std::regex_match(strT, m, timeRegex);
std::cout<<m.size()<<std::endl;
if(timeMatch)
{
std::cout<<m[0]<<std::endl;
std::cout<<m[1]<<std::endl;
std::cout<<m[2]<<std::endl;
std::cout<<m[3]<<std::endl;
std::cout<<m[4]<<std::endl;
}
我们看到它m.size()
总是 5,不管有没有 ms 字段!m[4]
如果没有 ms 字段,则为空字符串。这种行为是 C++ 正则表达式中的默认行为吗?或者当我对尺寸有疑问时,我应该尝试/抓住(或其他一些安全措施)吗?我的意思是......即使大小在这里也有点误导!