这是前一个SO问题及其讨论的延续。
Different Between std::regex_match & std::regex_search
在我的问题中,编写了以下正则表达式以从给定的输入字符串中获取日:
std::string input{ "Mon Nov 25 20:54:36 2013" };
//Day:: Exactly Two Number surrounded by spaces in both side
std::regex r{R"(\s\d{2}\s)"};
在其中一个答案中,它被更改为R"(.*?\s(\d{2})\s.*)"
以创建并因此捕获组和第一个子匹配。使用regex_match
或regex_search
解析日期信息时,一切正常。
现在我编写了以下regex expressions
来解析上面输入字符串中的各种内容,如下所示:
std::string input{ "Mon Nov 25 20:54:36 2013" };
//DayStr:: Exactly Three Letter at the start and followed by spaces(Output: Mon)
std::regex dayStrPattern{ R"(^\w{3}\s)" };
//Day:: Exactly Two Number surrounded by spaces in both side(Output: 25)
std::regex dayPattern{ R"(\s\d{2}\s)" };
//Month:: Exactly Three letter surrounded by spaces in both side(Output: Nov)
std::regex monthPattern{ R"(\s\w{3}\s)" };
//Year:: Exactly Four Number at the end of the string(Output: 2013)
std::regex yearPattern{ R"(\s\d{4}$)" };
//Hour:: Exactly two Number surrounded by spaces in left side and : in right side(Output:20)
std::regex hourPattern{ R"(\s\d{2}:{1})" };
//Min:: Exactly two Number sorruounded by : in left side and : in right side(Output: 54)
std::regex minPattern{ R"(:{1}\d{2}:{1})" };
//Second::Exactly two Number surrounded by : in the left side and space in right side(Output: 36)
std::regex secPattern{ R"(:{1}\d{2}\s)" };
我测试了上面的正则表达式here,它们似乎是正确的。
现在我们可以在这里使用分组机制,以便我们在方法std::regex_search
中传递单个正则表达式,而不是 7个不同的正则表达式< / STRONG>?。这样std :: regex_search会将输出存储到其std::smatch
子匹配向量中。这可能吗?我看过documentation
和A Tour Of C++ book
,但对regular expression grouping
没有太多了解。
一般情况下我们应该何时以及如何使用/设计分组,以便在一次调用std :: regex_search时获取各种信息?
此时我必须使用不同的正则表达式调用 7次std :: regex_search 来获取各种信息然后使用它。我确信有更好的方法来实现它,而不是我现在正在做的事情。
答案 0 :(得分:2)
无需调用regex_match
7次来匹配相同输入的7个部分,只需每次创建多个捕获组而不是单个捕获组。例如,将regex
更改为
std::regex r{R"(^(\w{3}) (\w{3}) (\d{2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$)"};
然后,只需拨打match_results
regex_match
获取所有匹配项
if (std::regex_match(input,match,r)){
for(auto const& m : match) {
std::cout << m << '\n';
}
}