35

以下のプログラムは、C++11 std::regex_match & std::regex_searchを使用して「日」情報を取得するように作成されています。ただし、最初の方法を使用すると戻りfalse、2 番目の方法を使用すると戻りますtrue(予想される)。ドキュメントとこれに関連する既存の 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.

誰かが上記の例と、一般的にこれらのメソッドの使用例を説明できますか?

4

2 に答える 2

34

regex_matchtrueは入力シーケンス全体が一致した場合にのみ戻りますがregex_search、サブシーケンスのみが に一致した場合でも成功しregexます。

N3337 からの引用、

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

効果:e正規表現とすべての文字シーケンス[first,last)との間に一致があるかどうかを判断します。そのような一致が存在する場合は...返し、そうでない場合は返します。truefalse

上記の説明は、regex_match一致するシーケンスへの反復子のペアを取るオーバーロードに関するものです。残りのオーバーロードは、このオーバーロードに関して定義されます。

対応するregex_searchオーバーロードは次のように記述されます。

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

効果:正規表現に一致するサブシーケンス[first,last)があるかどうかを判断しますe。そのようなシーケンスが存在する場合は...返し、そうでない場合は返します。truefalse


あなたの例では、両方に変更regexすると成功します(ただし、一致結果はその日だけではなく、日付文字列全体になります)。r{R"(.*?\s\d{2}\s.*)"};regex_matchregex_search

regex_matchと の両方で1 日がキャプチャされて表示される例の修正バージョンのライブ デモregex_search

于 2014-11-02T05:21:39.097 に答える
19

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

"one two three four"

regex_search式でその文字列を使用する"three"と、成功"three"します。"one two three four"

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

于 2014-11-02T05:20:20.677 に答える