C++ Library containing a lot of needful things: Stack Trace, Command Line Parser, Resource Handling, Configuration Files, Unix Command Execution, Directories, Regular Expressions, Tokenizer, Function Trace, Standard Extensions.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

139 lines
4.4 KiB

/** @file
$Id$
$Date$
$Author$
@copy © Marc Wäckerlin
@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 <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:
/// 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
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, see the @c man
page for POSIX regular expressions (on linux: @c
info&nbsp;7&nbsp;regex)
@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 mrw::invalid_argument if pattern compilation fails or @c nosub
was set in @c flags
*/
RegExp(const std::string& pattern, bool hassub=false, int flags=extended)
throw(std::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) 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;
};
}