2014-11-02 164 views
19

下面的程序已被編寫爲使用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 

爲什麼第一正則表達式方法返回在這種情況下falseregex似乎是正確的,所以理想情況下,兩者應該已被退回true。我運行了上述程序,將std::regex_match(input,match,r)更改爲std::regex_match(input,r),發現它仍然返回false.

有人可以解釋上面的例子,一般來說,這些方法的用例?

回答

18

regex_match僅當整個輸入序列匹配時才返回true,而即使只有子序列匹配regexregex_search也會成功。

從N3337報價,

§28.11.2/ 2regex_match[re.alg.match]

效果:確定是否有正則表達式e之間的匹配,和所有的字符序列[first,last)...如果存在這樣的匹配則返回true,否則返回false

以上描述是針對regex_match重載,它將一對迭代器帶到要匹配的序列。剩餘的重載是根據這個過載定義的。

相應regex_search過載被描述爲

§28.11.3/ 2regex_search[re.alg.search]

效果:確定是否存在一些子序列在[first,last)內,與正則表達式e匹配。 ...如果存在這樣的序列,則返回true,否則返回false


在您的例子,如果你修改regexr{R"(.*?\s\d{2}\s.*)"};regex_matchregex_search會成功(但比賽結果不只是一天,但整個日期字符串)。

Live demo您的示例的修改版本,其中日期被regex_matchregex_search捕獲並顯示。

+0

感謝您的解釋。你能解釋一下爲什麼我們需要從match [0]改變爲match [1]來獲得兩種情況下的確切結果?我的意思是關於std :: smatch使用理解。 – 2014-11-02 05:54:00

+1

@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

12

這很簡單。 regex_search查看字符串以查找字符串的任何部分是否與正則表達式匹配。 regex_match檢查整個字符串是否匹配正則表達式。舉一個簡單的例子,考慮以下字符串:

"one two three four" 

如果我對字符串表達式"three"使用regex_search,它會成功,因爲"three"可以"one two three four"

找到不過,如果我使用regex_match相反,它會失敗,因爲"three"不是整個字符串,而只是其中的一部分。

相關問題