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)
....
Returnstrue
if such a match exists,false
otherwise.
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
....
Returnstrue
if such a sequence exists,false
otherwise.
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