以下のプログラムは、C++ 11 std :: regex_match & std :: regex_search を使用して「Day」情報を取得するように記述されています。ただし、最初のメソッドを使用するとfalse
が返され、2番目のメソッドを使用するとtrue
(expected)が返されます。ドキュメントと既存のSOこれに関連する質問を読みましたが、これら2つの方法の違いと、どちらを使用すべきかを理解できませんか?よくある問題?
_#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.
_を返すことがわかりました
誰かが上記の例を説明し、一般的にこれらの方法のユースケースを使用できますか?
とても簡単です。 regex_search
は、文字列を調べて、文字列の一部が正規表現に一致するかどうかを確認します。 regex_match
は、文字列全体が正規表現に一致するかどうかを確認します。簡単な例として、次の文字列を指定します。
"one two three four"
式regex_search
でその文字列に"three"
を使用すると、"three"
は"one two three four"
で見つかるため、成功します。
ただし、代わりにregex_match
を使用すると、"three"
は文字列全体ではなく、一部のみであるため失敗します。