与 this regex ,我想匹配有或没有毫秒 (ms) 字段的时间。为了完整起见,我在这里编写正则表达式(我删除了 regex101 中的 anchor 以启用多行):
^(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 字段!如果没有 ms 字段,m[4]
是一个空字符串。这种行为是 C++ 正则表达式中的默认行为吗?或者我应该在对尺寸有疑问时尝试/捕捉(或其他一些安全措施)?我的意思是...即使尺寸在这里也有点误导!
最佳答案
m.size()
将始终是表达式中标记的子表达式的数量加 1(对于整个表达式)。
在您的代码中您有 4 个标记的子表达式,它们是否匹配对 m
的大小没有影响。
如果你想知道现在是否有毫秒,你可以检查:
m[4].matched
关于C++11:使用正则表达式进行两种可能的匹配次数的安全实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41243107/