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