我试图在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;
}
答案 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
的更多信息希望这有帮助!