web-dev-qa-db-ja.com

std :: regex_matchとstd :: regex_searchの違いは?

以下のプログラムは、C++ 11 std :: regex_matchstd :: regex_search を使用して「Day」情報を取得するように記述されています。ただし、最初のメソッドを使用するとfalseが返され、2番目のメソッドを使用するとtrue(expected)が返されます。ドキュメントと既存のSOこれに関連する質問を読みましたが、これら2つの方法の違いと、どちらを使用すべきかを理解できませんか?よくある問題?

regex_matchと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._を返すことがわかりました

誰かが上記の例を説明し、一般的にこれらの方法のユースケースを使用できますか?

30
Mantosh Kumar

とても簡単です。 regex_searchは、文字列を調べて、文字列の一部が正規表現に一致するかどうかを確認します。 regex_matchは、文字列全体が正規表現に一致するかどうかを確認します。簡単な例として、次の文字列を指定します。

"one two three four"

regex_searchでその文字列に"three"を使用すると、"three""one two three four"で見つかるため、成功します。

ただし、代わりにregex_matchを使用すると、"three"は文字列全体ではなく、一部のみであるため失敗します。

15