C++11:使用正则表达式进行两种可能的匹配次数的安全实践

标签 c++ regex c++11 multiple-matches

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/

相关文章:

c++ - g++:在涉及多个翻译单元的情况下RVO如何工作

c++ - 辛>> "no operator matches these operands"

c - 正则表达式 URL 捕获组

c++ - 当我在并行合并排序中增加 vector 的大小时出现段错误

c++ - STL或Boost中是否有容器在修改后保留排序值?

C++ 多维数组的可能性

c++ - boost 程序选项在从命令行读取时更改数据(这是 boost 中的错误吗?)

C++ ifstream 和 ofstream 重载运算符从文件读取

regex - 301 重定向到带有查询字符串的 URL

javascript - 用于电子邮件匹配的正则表达式