C++ C++;11:两个可能匹配数的正则表达式的安全实践
对于,我想匹配时间,有或没有毫秒(ms)字段。为了完整性,我在这里编写正则表达式(我删除了正则表达式101中的锚以启用多行): 我不理解这个C++行为。现在您可以在regex101中看到,捕获组的数量取决于字符串。如果没有MS,则是3±1(因为C++使用匹配模式的匹配),如果有MS,则是4 +1。但在这个例子中:C++ C++;11:两个可能匹配数的正则表达式的安全实践,c++,regex,c++11,multiple-matches,C++,Regex,C++11,Multiple Matches,对于,我想匹配时间,有或没有毫秒(ms)字段。为了完整性,我在这里编写正则表达式(我删除了正则表达式101中的锚以启用多行): 我不理解这个C++行为。现在您可以在regex101中看到,捕获组的数量取决于字符串。如果没有MS,则是3±1(因为C++使用匹配模式的匹配),如果有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])(?:|(?
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;
}
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::coutstd::smatch
(也称为std::match_results
)基本上是一个容器,其中包含类型为std::sub_match
的元素。第一个元素是完整regexp表达式的匹配结果,后续元素保存每个子表达式的匹配结果。由于模式有4个子表达式,因此得到5个结果(4+完全匹配)。std::smatch
(也称为std::match_results)基本上是一个容器,其中包含std::sub_match
类型的元素。第一个元素是完整regexp表达式的匹配结果,后续元素保存每个子表达式的匹配结果。由于模式中有4个子表达式,因此将得到5个结果(4+完全匹配)。m.size()
将始终是表达式中标记的子表达式数加1(对于整个表达式)
在代码中有4个标记的子表达式,它们是否匹配对m
的大小没有影响
如果您现在想查看是否存在毫秒,可以检查:
m[4].matched
m.size()
始终是表达式中标记的子表达式数加1(对于整个表达式)
在代码中有4个标记的子表达式,它们是否匹配对m
的大小没有影响
如果您现在想查看是否存在毫秒,可以检查:
m[4].matched
因为smatch是一个匹配结果
(见附件)
size返回它根据正则表达式包含的捕获组数分配的匹配数
捕获组:
括号将正则表达式分组在它们之间。它们将与内部正则表达式匹配的文本捕获到一个编号的组中,该组可以与编号的反向引用一起重用。它们允许您将正则表达式运算符应用于整个分组的正则表达式
这就是为什么不管最后用regex_match()填充什么,您的大小都将被分配为5。正如其他人所说,第五场是全场比赛
见:
因为smatch是一个匹配结果
(见附件)
size返回它根据正则表达式包含的捕获组数分配的匹配数
捕获组:
括号将正则表达式分组在它们之间。它们将与内部正则表达式匹配的文本捕获到一个编号的组中,该组可以与编号的反向引用一起重用。它们允许您将正则表达式运算符应用于整个分组的正则表达式
这就是为什么不管最后用regex_match()填充什么,您的大小都将被分配为5。正如其他人所说,第五场是全场比赛
见:
您是否在问为什么总共有5个组?因为在模式中定义了一个完整的匹配+4个捕获组。无论组是否匹配,根据ECMAScript scpes,空组总是预先填充一个空字符串并不重要。@WiktorStribiżew请检查我提供的regex101链接。如果没有ms字段,它应该只有3+1,而不是4+1。我不在乎,你和所有用户都不应该在意regex101显示了什么,它有自己的bug。重要的是,代码中包含的内容。您定义了4个捕获组-在索引0处,整个匹配的每个+1将有4个插槽。@WiktorStribiżew噢,所以这是regex101中的一个错误,字段的数量总是预定义的?您在编写模式时定义了组的数量。您是否在问为什么总共有5个组?因为在模式中定义了一个完整的匹配+4个捕获组。无论组是否匹配,根据ECMAScript scpes,空组总是预先填充一个空字符串并不重要。@WiktorStribiżew请检查我提供的regex101链接。如果没有ms字段,它应该只有3+1,而不是4+1。我不在乎,你和所有用户都不应该在意regex101显示了什么,它有自己的bug。重要的是,代码中包含的内容。您定义了4个捕获组-在索引0处的整个匹配中,每个+1将有4个插槽。@WiktorStribiżew噢,所以这是regex101中的一个错误,字段的数量始终是预定义的?您在编写模式时定义组的数量。这很有帮助。我喜欢它。谢谢:)这有帮助。我喜欢它。谢谢:)
m.size();// Returns the number of match results.
// a string is allocated for each 'Capture Group'
// and filled with the match substring.