initial version
This commit is contained in:
		
							
								
								
									
										36
									
								
								mrw/regexp.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								mrw/regexp.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| /** @file | ||||
|  | ||||
|     $Id$ | ||||
|  | ||||
|     $Date$ | ||||
|     $Author$ | ||||
|  | ||||
|     @copy © Marc Wäckerlin | ||||
|     @license LGPL, see file <a href="license.html">COPYING</a> | ||||
|  | ||||
|     $Log$ | ||||
|     Revision 1.1  2004/12/14 20:20:30  marc | ||||
|     initial version | ||||
|  | ||||
|  | ||||
| */ | ||||
|  | ||||
| #include <mrw/regexp.hpp> | ||||
| #include <mrw/exception.hpp> | ||||
|  | ||||
| namespace mrw { | ||||
|  | ||||
|   RegExp::RegExp(const std::string& pattern, int flags) | ||||
|     throw(std::exception, std::bad_exception) { | ||||
|     if (regcomp(&_regex, pattern.c_str(), flags|nosub)) | ||||
|       throw(mrw::invalid_argument(pattern)); | ||||
|   } | ||||
|  | ||||
|   RegExp::~RegExp() throw() { | ||||
|     regfree(&_regex); | ||||
|   } | ||||
|  | ||||
|   bool RegExp::operator()(const std::string& text) const throw() { | ||||
|     return !regexec(const_cast<regex_t*>(&_regex), text.c_str(), 0, 0, 0); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										112
									
								
								mrw/regexp.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								mrw/regexp.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| /** @file | ||||
|  | ||||
|     $Id$ | ||||
|  | ||||
|     $Date$ | ||||
|     $Author$ | ||||
|  | ||||
|     @copy © Marc Wäckerlin | ||||
|     @license LGPL, see file <a href="license.html">COPYING</a> | ||||
|  | ||||
|     $Log$ | ||||
|     Revision 1.1  2004/12/14 20:20:30  marc | ||||
|     initial version | ||||
|  | ||||
|  | ||||
| */ | ||||
|  | ||||
| #include <regex.h> | ||||
| #include <string> | ||||
| #include <stdexcept> | ||||
|  | ||||
| namespace mrw { | ||||
|  | ||||
|   /** @defgroup regexp Regular Expressions | ||||
|  | ||||
|       A simple wrapper around the C POSIX regular expression library | ||||
|       with a C++ Interface. | ||||
|  | ||||
|       Usage sample: | ||||
|       @code | ||||
|         std::ifstream file(filename);           // read from a file | ||||
|         mrw::RegExp findBrackets("^\\[.*\\]$"); // look for "[some text]" | ||||
|         for (std::string line; | ||||
|              mrw::getline(file, line);)         // read line by line | ||||
|           if (findBrackets(line))               // check for regular expression | ||||
|             found(line);                        // found, do something | ||||
|       @endcode | ||||
|  | ||||
|   */ | ||||
|  | ||||
|   /** @brief a regular expression | ||||
|        | ||||
|       This class manages a simple regular expression. | ||||
|        | ||||
|       Usage sample: | ||||
|       @code | ||||
|         std::ifstream file(filename);           // read from a file | ||||
|         mrw::RegExp findBrackets("^\\[.*\\]$"); // look for "[some text]" | ||||
|         for (std::string line; | ||||
|              mrw::getline(file, line);)         // read line by line | ||||
|           if (findBrackets(line))               // check for regular expression | ||||
|             found(line);                        // found, do something | ||||
|       @endcode | ||||
|  | ||||
|   */ | ||||
|   class RegExp { | ||||
|    | ||||
|   public: | ||||
|  | ||||
|     /** @brief flags that influence regular expressions | ||||
|  | ||||
|         Flag @c newline treats a newline in the text to be compared as | ||||
|         dividing the text into multiple lines, so that @c $ can match | ||||
|         before the newline and @c ^ can match after.  Also, don't | ||||
|         permit @c . to match a newline, and don't permit @c [^...] to | ||||
|         match a newline. | ||||
|  | ||||
|         Otherwise, newline acts like any other ordinary character. | ||||
|  | ||||
|         Flag @c nosub is used internally, don't specify it. | ||||
|  | ||||
|     */ | ||||
|     enum Flags { | ||||
|       extended = REG_EXTENDED,  ///< use extended regular expressions | ||||
|       icase    = REG_ICASE,     ///< ignore case in match | ||||
|       nosub    = REG_NOSUB,     ///< @b internal (report only success/fail) | ||||
|       newline  = REG_NEWLINE    ///< treat lines individually | ||||
|     }; | ||||
|  | ||||
|     /** @brief define a new regular expression | ||||
|  | ||||
|         The regular expression is compiled on instanciation and can | ||||
|         then be matced several times on different texts. | ||||
|  | ||||
|         @param pattern the regular expression pattern, thee the @c man | ||||
|                        page for POSIX regular expressions (on linux: @c | ||||
|                        info 7 regex) | ||||
|         @param flags   special flags, they default to extended|nosub and | ||||
|                        should consist of the Flag values combined with @c | | ||||
|  | ||||
|         @throw std::invalid_argument if pattern compilation fails | ||||
|     */ | ||||
|     RegExp(const std::string& pattern, int flags = extended) | ||||
|       throw(std::exception, std::bad_exception); | ||||
|  | ||||
|     /** @brief cleans up expression from memory */ | ||||
|     ~RegExp() throw(); | ||||
|  | ||||
|     /** @brief apply the expression, match a text against the expression | ||||
|  | ||||
|         @param text a text that is matched against the regular expression | ||||
|         @return | ||||
|           - true if @c text matches | ||||
|           - false otherwise */ | ||||
|     bool operator()(const std::string& text) const throw(); | ||||
|    | ||||
|   private: | ||||
|    | ||||
|     regex_t _regex; | ||||
|    | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										45
									
								
								mrw/regexp_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								mrw/regexp_test.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /** @file | ||||
|  | ||||
|     $Id$ | ||||
|  | ||||
|     $Date$ | ||||
|     $Author$ | ||||
|  | ||||
|     @copy © Marc Wäckerlin | ||||
|     @license LGPL, see file <a href="license.html">COPYING</a> | ||||
|  | ||||
|     $Log$ | ||||
|     Revision 1.1  2004/12/14 20:20:30  marc | ||||
|     initial version | ||||
|  | ||||
|  | ||||
| */ | ||||
|  | ||||
| #include <mrw/regexp.hpp> | ||||
|  | ||||
| #include <cppunit/TestFixture.h> | ||||
| #include <cppunit/ui/text/TestRunner.h> | ||||
| #include <cppunit/extensions/HelperMacros.h> | ||||
| #include <cppunit/extensions/TestFactoryRegistry.h> | ||||
|  | ||||
| class RegExpTest: public CppUnit::TestFixture {  | ||||
| public: | ||||
|   void CheckRegExp() { | ||||
|     mrw::RegExp findHalloWelt("^Hallo.*Welt$"); | ||||
|     CPPUNIT_ASSERT(findHalloWelt("Hallo Meine Welt")); | ||||
|     CPPUNIT_ASSERT(!findHalloWelt("xxx")); | ||||
|     CPPUNIT_ASSERT(!findHalloWelt("")); | ||||
|     CPPUNIT_ASSERT(!findHalloWelt(" Hallo Welt ")); | ||||
|     CPPUNIT_ASSERT(findHalloWelt("HalloWelt")); | ||||
|   } | ||||
|   CPPUNIT_TEST_SUITE(RegExpTest); | ||||
|   CPPUNIT_TEST(CheckRegExp); | ||||
|   CPPUNIT_TEST_SUITE_END(); | ||||
| }; | ||||
| CPPUNIT_TEST_SUITE_REGISTRATION(RegExpTest); | ||||
|  | ||||
| int main() { | ||||
|   CppUnit::TextUi::TestRunner runner; | ||||
|   runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); | ||||
|   return runner.run() ? 0 : 1; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user