需要在c ++中的两个子串之间获取子串,第二个子串应该在第一个子串之后首先出现

时间:2017-05-26 05:28:31

标签: c++ regex string c++11

我试图在sStr1和sStr2之间获得子串,条件是我希望sStr2应该在sStr1之后首次出现,就像我sStr1 =“,”和sStr2 =“”那么rStr应该是“2017”,但是目前我得到的是“2017年01:05:00”。 我应该在这段代码中做些什么改变?

void getBtwString(std::string oStr, std::string sStr1, std::string sStr2, std::string &rStr)
{
    using namespace std::literals::string_literals;
    auto start = sStr1;
    auto end = sStr2;
    std::regex base_regex(start + "(.*)" + end);
    auto example = oStr;
    std::smatch base_match;
    std::string matched;
    if (std::regex_search(example, base_match, base_regex)) 
    {
        if (base_match.size() == 2) 
        {
            matched = base_match[1].str();
        }
        rStr = matched;
    }
}

int main(void) 
{
    string d1 = "May 23, 2017 at 01:05:00 PM";
    string d2 = "June 24, 2017 at 01:05:00 PM";

    string strout;

    getBtwString(d1, ", ", " ", strout); // second solution
    cout<< strout;
    return 1;
}

1 个答案:

答案 0 :(得分:0)

你需要让* 非贪婪(不情愿),如下所示:

(.*?)

最终正则表达式:, (.*)

  • *会尽可能多地匹配 。因此,在您的情况下,因为有相当多的空格(),它将匹配到最后一个空格。例如,如果输入为June 24, 2017 at 01:05:00 PM,那么*将占用尽可能多的数量,这意味着最后一个空格,即, 2017 at 01:05:00

  • *?使其不贪婪或不情愿,这意味着它会尽可能少地匹配 。对于June 24, 2017 at 01:05:00 PM的相同示例输入,它将匹配第一个空格,即, 2017

您可以阅读有关greedy vs reluctant

的更多信息

希望这有帮助!