possibility to evaluate and extract sub expressions
This commit is contained in:
		@@ -9,28 +9,46 @@
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2004/12/16 13:09:31  marc
 | 
			
		||||
    possibility to evaluate and extract sub expressions
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2004/12/14 20:20:30  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/string.hpp>
 | 
			
		||||
#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(const std::string& pattern, bool hassub, int flags)
 | 
			
		||||
    throw(std::exception):
 | 
			
		||||
    _hassub(hassub) {
 | 
			
		||||
      if (flags&nosub) throw mrw::invalid_argument("nosub");
 | 
			
		||||
      if (regcomp(&_regex, pattern.c_str(), (_hassub?flags:(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);
 | 
			
		||||
  bool RegExp::operator()(const std::string& text) throw(std::bad_exception) {
 | 
			
		||||
    if (_hassub)
 | 
			
		||||
      return !regexec(&_regex, (_text=text).c_str(), MAX_SUB, _sub, 0);
 | 
			
		||||
    else
 | 
			
		||||
      return !regexec(&_regex, text.c_str(), 0, 0, 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::string RegExp::operator[](unsigned int n) const throw(std::exception) {
 | 
			
		||||
    if (!_hassub)
 | 
			
		||||
      throw mrw::invalid_argument("initialized with no sub expressions");
 | 
			
		||||
    if (n>=MAX_SUB || _sub[n].rm_so<0 || _sub[n].rm_eo<0)
 | 
			
		||||
      throw mrw::invalid_argument(mrw::string(n));
 | 
			
		||||
    return _text.substr(_sub[n].rm_so, _sub[n].rm_eo-_sub[n].rm_so);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,9 @@
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2004/12/16 13:09:31  marc
 | 
			
		||||
    possibility to evaluate and extract sub expressions
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2004/12/14 20:20:30  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
@@ -57,6 +60,9 @@ namespace mrw {
 | 
			
		||||
  
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
    /// The maximum number of sub expressions that are evaluated.
 | 
			
		||||
    static const unsigned int MAX_SUB = 99;
 | 
			
		||||
 | 
			
		||||
    /** @brief flags that influence regular expressions
 | 
			
		||||
 | 
			
		||||
        Flag @c newline treats a newline in the text to be compared as
 | 
			
		||||
@@ -82,16 +88,20 @@ namespace mrw {
 | 
			
		||||
        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
 | 
			
		||||
        @param pattern the regular expression pattern, see the @c man
 | 
			
		||||
                       page for POSIX regular expressions (on linux: @c
 | 
			
		||||
                       info 7 regex)
 | 
			
		||||
        @param flags   special flags, they default to extended|nosub and
 | 
			
		||||
        @param hassub  pass @c true if you want to evaluate sub expressions
 | 
			
		||||
        @param flags   special flags, they default to extended and
 | 
			
		||||
                       should consist of the Flag values combined with @c |
 | 
			
		||||
                       flag @c nosub must not be used, because it is set
 | 
			
		||||
                       automatically if necessary
 | 
			
		||||
 | 
			
		||||
        @throw std::invalid_argument if pattern compilation fails
 | 
			
		||||
        @throw mrw::invalid_argument if pattern compilation fails or @c nosub
 | 
			
		||||
                                     was set in @c flags
 | 
			
		||||
    */
 | 
			
		||||
    RegExp(const std::string& pattern, int flags = extended)
 | 
			
		||||
      throw(std::exception, std::bad_exception);
 | 
			
		||||
    RegExp(const std::string& pattern, bool hassub=false, int flags=extended)
 | 
			
		||||
      throw(std::exception);
 | 
			
		||||
 | 
			
		||||
    /** @brief cleans up expression from memory */
 | 
			
		||||
    ~RegExp() throw();
 | 
			
		||||
@@ -102,11 +112,28 @@ namespace mrw {
 | 
			
		||||
        @return
 | 
			
		||||
          - true if @c text matches
 | 
			
		||||
          - false otherwise */
 | 
			
		||||
    bool operator()(const std::string& text) const throw();
 | 
			
		||||
    bool operator()(const std::string& text) throw(std::bad_exception);
 | 
			
		||||
 | 
			
		||||
    /** @brief get the n-th sub expression of the last matched text
 | 
			
		||||
 | 
			
		||||
        If the RegExp was instanciated with @c Regexp(pattern, true),
 | 
			
		||||
        so that sub expressions are evaluated, then you can get the
 | 
			
		||||
        n-th matched sub expression.
 | 
			
		||||
 | 
			
		||||
        @param n the number of sub expression to get, get the n-th sub
 | 
			
		||||
                 expression
 | 
			
		||||
 | 
			
		||||
        @throw mrw::invalid_argument if this subexpression is not
 | 
			
		||||
                                     available
 | 
			
		||||
    */
 | 
			
		||||
    std::string operator[](unsigned int n) const throw(std::exception);
 | 
			
		||||
  
 | 
			
		||||
  private:
 | 
			
		||||
  
 | 
			
		||||
    regex_t _regex;
 | 
			
		||||
    bool _hassub;
 | 
			
		||||
    regmatch_t _sub[MAX_SUB];
 | 
			
		||||
    std::string _text;
 | 
			
		||||
  
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,9 @@
 | 
			
		||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
			
		||||
 | 
			
		||||
    $Log$
 | 
			
		||||
    Revision 1.2  2004/12/16 13:09:31  marc
 | 
			
		||||
    possibility to evaluate and extract sub expressions
 | 
			
		||||
 | 
			
		||||
    Revision 1.1  2004/12/14 20:20:30  marc
 | 
			
		||||
    initial version
 | 
			
		||||
 | 
			
		||||
@@ -16,6 +19,7 @@
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <mrw/regexp.hpp>
 | 
			
		||||
#include <mrw/exception.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/TestFixture.h>
 | 
			
		||||
#include <cppunit/ui/text/TestRunner.h>
 | 
			
		||||
@@ -31,9 +35,23 @@ public:
 | 
			
		||||
    CPPUNIT_ASSERT(!findHalloWelt(""));
 | 
			
		||||
    CPPUNIT_ASSERT(!findHalloWelt(" Hallo Welt "));
 | 
			
		||||
    CPPUNIT_ASSERT(findHalloWelt("HalloWelt"));
 | 
			
		||||
    mrw::RegExp extractTest("^Guten (.*) (Herr|Frau) (.*)$", true);
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest("Guten Tag Frau Zuercher"));
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest[1]=="Tag" &&
 | 
			
		||||
                   extractTest[2]=="Frau" &&
 | 
			
		||||
                   extractTest[3]=="Zuercher");
 | 
			
		||||
  }
 | 
			
		||||
  void ExceptionTest() {
 | 
			
		||||
    mrw::RegExp extractTest("^Guten (.*) (Herr|Frau) (.*)$", true);
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest("Guten Tag Herr Schweizer"));
 | 
			
		||||
    CPPUNIT_ASSERT(extractTest[1]=="Tag" &&
 | 
			
		||||
                   extractTest[2]=="Herr" &&
 | 
			
		||||
                   extractTest[3]=="Schweizer");
 | 
			
		||||
    std::string s = extractTest[4];
 | 
			
		||||
  }
 | 
			
		||||
  CPPUNIT_TEST_SUITE(RegExpTest);
 | 
			
		||||
  CPPUNIT_TEST(CheckRegExp);
 | 
			
		||||
  CPPUNIT_TEST_EXCEPTION(ExceptionTest, mrw::invalid_argument);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
};
 | 
			
		||||
CPPUNIT_TEST_SUITE_REGISTRATION(RegExpTest);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user