the Compartmented Robust Posix C++ Unit Test system

Matching strings with regular expressions

Regular expressions are preferably matched using the pseudo operator =~(), but can also be matched using crpcut::match<matcher>(...) instantiated with crpcut::regex, with ASSERT_PRED(pred, ...) or VERIFY_PRED(pred, ...). This is easiest to show with an example:

     #include <crpcut.hpp>
     #include <string>
     #include <list>
     #include <sstream>
     class event_list
       event_list() : num(0) {}
       void push(std::string text)
       std::string pop()
         std::ostringstream os;
         os << num++ << " " << event_text.front();
         return os.str();
       std::list<std::string> event_text;
       size_t num;
     const char fmt[]
     = "^(\\+)?[[:digit:]]+" "[[:space:]]+" "[[:alnum:]]([[:alnum:]|[:space:]])*$";
     // i.e. LINE_FMT is a positive integer followed by at least one space and
     // then a string of at least one alphanumerical character and spaces.
       event_list el;
       el.push("something happened");
       el.push("what else happened?");
       ASSERT_TRUE(el.pop() =~ crpcut::regex(fmt, crpcut::regex::e));
       ASSERT_TRUE(el.pop() =~ crpcut::regex(fmt, crpcut::regex::e));
     int main(int argc, char *argv[])
       return crpcut::run(argc, argv);


The flag crpcut::regex::e matches the string against an extended regular expression. Other flags are crpcut::regex::i for ignoring case, and crpcut::regex::m for multi line patterns.

Be careful with patterns containing \, since C/C++ interprets them as character escapes.

The output from the short test program is:

     FAILED!: verify_output_format
     phase="running"  --------------------------------------------------------------
     ASSERT_TRUE(el.pop() =~ crpcut::regex(fmt, crpcut::regex::e))
       is evaluated as:
         1 what else happened? =~ regex("^(\+)?[[:digit:]]+[[:space:]]+[[:alnum:]]([[:alnum:]|[:space:]])*$")
     1 test cases selected
                    Sum   Critical   Non-critical
     FAILED   :       1          1              0

With crpcut::regex you can only assert that strings match a regular expression. If you need more advanced functionality, for example picking sub strings for decisions, you have to use either regcomp() and regexec(), or C++std::regex if your compiler supports it.
The site contains a wealth of info on regular expressions, if you feel rusty.