Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11:两个可能匹配数的正则表达式的安全实践_C++_Regex_C++11_Multiple Matches - Fatal编程技术网

C++ C++;11:两个可能匹配数的正则表达式的安全实践

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])(?:|(?

对于,我想匹配时间,有或没有毫秒(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])(?:|(?:\.)([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::cout
std::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.