如何使用正则表达式"分组或#34;用于C ++中的多个正则表达式?

时间:2014-11-03 02:18:35

标签: c++ regex parsing c++11

这是前一个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_matchregex_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 来获取各种信息然后使用它。我确信有更好的方法来实现它,而不是我现在正在做的事情。

1 个答案:

答案 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';
    }
}

Live demo