Below program has been written to fetch the "Day" information using the C++11 std::regex_match & std::regex_search. However, using the first method returns false and second method returns true(expected). I read the documentation and already existing SO question related to this, but I do not understand the difference between these two methods and when we should use either of them? Can they both be used interchangeably for any common problem?
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 Why first regex method returns false in this case?. The regex seems to be correct so ideally both should have been returned true. I ran the above program by changing the std::regex_match(input,match,r) to std::regex_match(input,r) and found that it still returns false.
Could somebody explain the above example and, in general, use cases of these methods?
regex_match()This function template is used to match the given pattern. This function returns true if the given expression matches the string. Otherwise, the function returns false.
It returns whether the target sequence matches the regular expression rgx. The target sequence is either s or the character sequence between first and last, depending on the version used.
Boost. Regex allows you to use regular expressions in C++. As the library is part of the standard library since C++11, you don't depend on Boost. Regex if your development environment supports C++11.
regex_match only returns true when the entire input sequence has been matched, while regex_search will succeed even if only a sub-sequence matches the regex.
Quoting from N3337,
§28.11.2/2
regex_match[re.alg.match]
Effects: Determines whether there is a match between the regular expressione, and all of the character sequence[first,last)....Returnstrueif such a match exists,falseotherwise.
The above description is for the regex_match overload that takes a pair of iterators to the sequence to be matched. The remaining overloads are defined in terms of this overload.
The corresponding regex_search overload is described as
§28.11.3/2
regex_search[re.alg.search]
Effects: Determines whether there is some sub-sequence within[first,last)that matches the regular expressione....Returnstrueif such a sequence exists,falseotherwise.
In your example, if you modify the regex to r{R"(.*?\s\d{2}\s.*)"}; both regex_match and regex_search will succeed (but the match result is not just the day, but the entire date string).
Live demo of a modified version of your example where the day is being captured and displayed by both regex_match and regex_search.
It's very simple. regex_search looks through the string to find if any portion of the string matches the regex. regex_match checks if the whole string is a match for the regex. As a simple example, given the following string:
"one two three four" If I use regex_search on that string with the expression "three", it will succeed, because "three" can be found in "one two three four"
However, if I use regex_match instead, it will fail, because "three" is not the whole string, but only a part of it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With