c++regexc++11

How to check for success in c++11 std::regex_replace?


I'd like to do the c++11 equivalent of a perl checked-replacement operation:

my $v = "foo.rat"

if ( $v =~ s/\.rat$/.csv/ )
{
   ...
}

I can do the replacement without trouble:

#include <iostream>
#include <string>
#include <regex>

int main()
{
   std::string s{ "foo.rat" } ;
   std::regex reg{ R"((.*)\.rat$)" } ;

   s = std::regex_replace( s, reg, "$1.csv" ) ;

   std::cout << s << std::endl ;

   s = std::regex_replace( "foo.noo", reg, "$1.csv" ) ;
   std::cout << s << std::endl ;

   return 0 ;
}

This gives:

foo.csv
foo.noo

Notice that the replace operation on the non-matching expression doesn't throw an error (which is what I expected).

Looking at the regex_replace documentation, it's not obvious to me how to check for the success of the replace operation. I could do a string compare, but that seems backwards?


Solution

  • Try to find match with std::regex_match or std::regex_search, check if something is matched, then replace found portion of string using std::string::replace. That shouldn't lead to performance loss.