下面的程序已被編寫爲使用C++獲取「Day」信息11 std::regex_match & std::regex_search。但是,使用第一種方法返回false
,第二種方法返回true
(預期)。我閱讀了文檔和已經存在的與此相關的SO問題,但我不明白這兩種方法之間的區別,以及我們何時應該使用它們?它們可以互換用於任何常見問題嗎?std :: regex_match和std :: regex_search之間的區別?
Difference between regex_match and regex_search?
#include<iostream>
#include<string>
#include<regex>
int main()
{
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)"};
//std::regex r{"\\s\\d{2}\\s"};
std::smatch match;
if (std::regex_match(input,match,r)) {
std::cout << "Found" << "\n";
} else {
std::cout << "Did Not Found" << "\n";
}
if (std::regex_search(input, match,r)) {
std::cout << "Found" << "\n";
if (match.ready()){
std::string out = match[0];
std::cout << out << "\n";
}
}
else {
std::cout << "Did Not Found" << "\n";
}
}
輸出
Did Not Found
Found
25
爲什麼第一正則表達式方法返回在這種情況下false
? regex
似乎是正確的,所以理想情況下,兩者應該已被退回true
。我運行了上述程序,將std::regex_match(input,match,r)
更改爲std::regex_match(input,r)
,發現它仍然返回false.
有人可以解釋上面的例子,一般來說,這些方法的用例?
感謝您的解釋。你能解釋一下爲什麼我們需要從match [0]改變爲match [1]來獲得兩種情況下的確切結果?我的意思是關於std :: smatch使用理解。 – 2014-11-02 05:54:00
@MantoshKumar我在日期字段'(\ d {2})'周圍添加了括號來創建一個捕獲組。從'match_results' [documentation](http://en.cppreference.com/w/cpp/regex/match_results/operator_at),'match [0]'總是返回整個匹配的表達式,'match [1]'返回第一個子匹配等。在這種情況下,我們每天只有一個捕獲組,並存儲在第一個子匹配中。 – Praetorian 2014-11-02 06:10:19