2000-08-29 23:26:29 +04:00
|
|
|
/*=========================================================================
|
|
|
|
|
|
|
|
Program: Insight Segmentation & Registration Toolkit
|
|
|
|
Module: $RCSfile$
|
|
|
|
Language: C++
|
|
|
|
Date: $Date$
|
|
|
|
Version: $Revision$
|
|
|
|
|
|
|
|
|
|
|
|
Copyright (c) 2000 National Library of Medicine
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
See COPYRIGHT.txt for copyright details.
|
|
|
|
|
|
|
|
=========================================================================*/
|
|
|
|
/// Original Copyright notice:
|
|
|
|
// Copyright (C) 1991 Texas Instruments Incorporated.
|
|
|
|
//
|
|
|
|
// Permission is granted to any individual or institution to use, copy, modify,
|
|
|
|
// and distribute this software, provided that this complete copyright and
|
|
|
|
// permission notice is maintained, intact, in all copies and supporting
|
|
|
|
// documentation.
|
|
|
|
//
|
|
|
|
// Texas Instruments Incorporated provides this software "as is" without
|
|
|
|
// express or implied warranty.
|
|
|
|
//
|
|
|
|
// .LIBRARY vbl
|
|
|
|
// .HEADER Basics Package
|
|
|
|
// .INCLUDE cmRegularExpression.h
|
|
|
|
// .FILE cmRegularExpression.cxx
|
|
|
|
//
|
|
|
|
#ifndef cmRegularExpression_h
|
|
|
|
#define cmRegularExpression_h
|
|
|
|
|
2001-01-05 19:41:20 +03:00
|
|
|
#include "cmStandardIncludes.h"
|
2000-08-29 23:26:29 +04:00
|
|
|
|
|
|
|
const int NSUBEXP = 10;
|
|
|
|
|
|
|
|
//: Pattern matching with regular expressions
|
|
|
|
// A regular expression allows a programmer to specify complex
|
|
|
|
// patterns that can be searched for and matched against the
|
|
|
|
// character string of a string object. In its simplest form, a
|
|
|
|
// regular expression is a sequence of characters used to
|
|
|
|
// search for exact character matches. However, many times the
|
|
|
|
// exact sequence to be found is not known, or only a match at
|
|
|
|
// the beginning or end of a string is desired. The vbl regu-
|
|
|
|
// lar expression class implements regular expression pattern
|
|
|
|
// matching as is found and implemented in many UNIX commands
|
|
|
|
// and utilities.
|
|
|
|
//
|
|
|
|
// Example: The perl code
|
|
|
|
//
|
|
|
|
// $filename =~ m"([a-z]+)\.cc";
|
|
|
|
// print $1;
|
|
|
|
//
|
|
|
|
// Is written as follows in C++
|
|
|
|
//
|
|
|
|
// vbl_reg_exp re("([a-z]+)\\.cc");
|
|
|
|
// re.find(filename);
|
|
|
|
// cerr << re.match(1);
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// The regular expression class provides a convenient mechanism
|
|
|
|
// for specifying and manipulating regular expressions. The
|
|
|
|
// regular expression object allows specification of such pat-
|
|
|
|
// terns by using the following regular expression metacharac-
|
|
|
|
// ters:
|
|
|
|
//
|
|
|
|
// ^ Matches at beginning of a line
|
|
|
|
//
|
|
|
|
// $ Matches at end of a line
|
|
|
|
//
|
|
|
|
// . Matches any single character
|
|
|
|
//
|
|
|
|
// [ ] Matches any character(s) inside the brackets
|
|
|
|
//
|
|
|
|
// [^ ] Matches any character(s) not inside the brackets
|
|
|
|
//
|
|
|
|
// - Matches any character in range on either side of a dash
|
|
|
|
//
|
|
|
|
// * Matches preceding pattern zero or more times
|
|
|
|
//
|
|
|
|
// + Matches preceding pattern one or more times
|
|
|
|
//
|
|
|
|
// ? Matches preceding pattern zero or once only
|
|
|
|
//
|
|
|
|
// () Saves a matched expression and uses it in a later match
|
|
|
|
//
|
|
|
|
// Note that more than one of these metacharacters can be used
|
|
|
|
// in a single regular expression in order to create complex
|
|
|
|
// search patterns. For example, the pattern [^ab1-9] says to
|
|
|
|
// match any character sequence that does not begin with the
|
|
|
|
// characters "ab" followed by numbers in the series one
|
|
|
|
// through nine.
|
|
|
|
//
|
|
|
|
class cmRegularExpression {
|
|
|
|
public:
|
|
|
|
inline cmRegularExpression (); // cmRegularExpression with program=NULL
|
|
|
|
inline cmRegularExpression (char const*); // cmRegularExpression with compiled char*
|
|
|
|
cmRegularExpression (cmRegularExpression const&); // Copy constructor
|
|
|
|
inline ~cmRegularExpression(); // Destructor
|
|
|
|
|
|
|
|
void compile (char const*); // Compiles char* --> regexp
|
|
|
|
bool find (char const*); // true if regexp in char* arg
|
|
|
|
bool find (std::string const&); // true if regexp in char* arg
|
|
|
|
inline long start() const; // Index to start of first find
|
|
|
|
inline long end() const; // Index to end of first find
|
|
|
|
|
|
|
|
bool operator== (cmRegularExpression const&) const; // Equality operator
|
|
|
|
inline bool operator!= (cmRegularExpression const&) const; // Inequality operator
|
|
|
|
bool deep_equal (cmRegularExpression const&) const; // Same regexp and state?
|
|
|
|
|
|
|
|
inline bool is_valid() const; // true if compiled regexp
|
|
|
|
inline void set_invalid(); // Invalidates regexp
|
|
|
|
|
|
|
|
// awf added
|
|
|
|
int start(int n) const;
|
|
|
|
int end(int n) const;
|
|
|
|
std::string match(int n) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
const char* startp[NSUBEXP];
|
|
|
|
const char* endp[NSUBEXP];
|
|
|
|
char regstart; // Internal use only
|
|
|
|
char reganch; // Internal use only
|
|
|
|
const char* regmust; // Internal use only
|
|
|
|
int regmlen; // Internal use only
|
|
|
|
char* program;
|
|
|
|
int progsize;
|
|
|
|
const char* searchstring;
|
|
|
|
};
|
|
|
|
|
|
|
|
// cmRegularExpression -- Creates an empty regular expression.
|
|
|
|
|
|
|
|
inline cmRegularExpression::cmRegularExpression () {
|
|
|
|
this->program = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// cmRegularExpression -- Creates a regular expression from string s, and
|
|
|
|
// compiles s.
|
|
|
|
|
|
|
|
|
|
|
|
inline cmRegularExpression::cmRegularExpression (const char* s) {
|
|
|
|
this->program = NULL;
|
|
|
|
compile(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ~cmRegularExpression -- Frees space allocated for regular expression.
|
|
|
|
|
|
|
|
inline cmRegularExpression::~cmRegularExpression () {
|
|
|
|
//#ifndef WIN32
|
|
|
|
delete [] this->program;
|
|
|
|
//#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start --
|
|
|
|
|
|
|
|
inline long cmRegularExpression::start () const {
|
|
|
|
return(this->startp[0] - searchstring);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// End -- Returns the start/end index of the last item found.
|
|
|
|
|
|
|
|
|
|
|
|
inline long cmRegularExpression::end () const {
|
|
|
|
return(this->endp[0] - searchstring);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// operator!= //
|
|
|
|
|
|
|
|
inline bool cmRegularExpression::operator!= (const cmRegularExpression& r) const {
|
|
|
|
return(!(*this == r));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// is_valid -- Returns true if a valid regular expression is compiled
|
|
|
|
// and ready for pattern matching.
|
|
|
|
|
|
|
|
inline bool cmRegularExpression::is_valid () const {
|
|
|
|
return (this->program != NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// set_invalid -- Invalidates regular expression.
|
|
|
|
|
|
|
|
inline void cmRegularExpression::set_invalid () {
|
|
|
|
//#ifndef WIN32
|
|
|
|
delete [] this->program;
|
|
|
|
//#endif
|
|
|
|
this->program = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -- Return start index of nth submatch. start(0) is the start of the full match.
|
|
|
|
inline int cmRegularExpression::start(int n) const
|
|
|
|
{
|
|
|
|
return this->startp[n] - searchstring;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -- Return end index of nth submatch. end(0) is the end of the full match.
|
|
|
|
inline int cmRegularExpression::end(int n) const
|
|
|
|
{
|
|
|
|
return this->endp[n] - searchstring;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -- Return nth submatch as a string.
|
|
|
|
inline std::string cmRegularExpression::match(int n) const
|
|
|
|
{
|
|
|
|
return std::string(this->startp[n], this->endp[n] - this->startp[n]);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // cmRegularExpressionh
|