regex.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 1,634 行 · 第 1/4 页

HPP
1,634
字号
/* * * Copyright (c) 1998-2002 * Dr John Maddock * * Use, modification and distribution are subject to the  * Boost Software License, Version 1.0. (See accompanying file  * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ /*  *   LOCATION:    see http://www.boost.org for most recent version.  *   FILE         regex.cpp  *   VERSION      see <boost/version.hpp>  *   DESCRIPTION: Declares boost::reg_expression<> and associated  *                functions and classes. This header is the main  *                entry point for the template regex code.  *//* start with C compatibility API */#ifndef BOOST_RE_REGEX_HPP_INCLUDED#define BOOST_RE_REGEX_HPP_INCLUDED#ifndef BOOST_RE_CREGEX_HPP#include <boost/cregex.hpp>#endif#ifdef __cplusplus// what follows is all C++ don't include in C builds!!#ifdef BOOST_REGEX_DEBUG# include <iosfwd>#endif#include <new>#include <cstring>#ifndef BOOST_REGEX_CONFIG_HPP#include <boost/regex/config.hpp>#endif#ifndef BOOST_REGEX_FWD_HPP#include <boost/regex_fwd.hpp>#endif#ifndef BOOST_REGEX_STACK_HPP#include <boost/regex/v3/regex_stack.hpp>#endif#ifndef BOOST_REGEX_RAW_BUFFER_HPP#include <boost/regex/v3/regex_raw_buffer.hpp>#endif#ifndef BOOST_REGEX_KMP_HPP#include <boost/regex/v3/regex_kmp.hpp>#endif#ifndef BOOST_RE_PAT_EXCEPT_HPP#include <boost/regex/pattern_except.hpp>#endif#ifndef BOOST_REGEX_TRAITS_HPP#include <boost/regex/regex_traits.hpp>#endif#include <boost/type_traits/remove_cv.hpp>#include <boost/scoped_array.hpp>namespace boost{#ifdef __BORLANDC__   #pragma option push -a8 -b -Vx -Ve -pc -w-8027#endifnamespace re_detail{struct re_set_long;struct re_syntax_base;} // namespace re_detailnamespace deprecated{//// class char_regex_traits_i// provides case insensitive traits classes (deprecated):template <class charT>class char_regex_traits_i : public regex_traits<charT> {};template<>class char_regex_traits_i<char> : public regex_traits<char>{public:   typedef char char_type;   typedef unsigned char uchar_type;   typedef unsigned int size_type;   typedef regex_traits<char> base_type;   char BOOST_REGEX_CALL translate(char c, bool)const   {      return static_cast<const regex_traits<char>*>(this)->translate(c, true);   }};#ifndef BOOST_NO_WREGEXtemplate<>class char_regex_traits_i<wchar_t> : public regex_traits<wchar_t>{public:   typedef wchar_t char_type;   typedef unsigned short uchar_type;   typedef unsigned int size_type;   typedef regex_traits<wchar_t> base_type;   wchar_t BOOST_REGEX_CALL translate(wchar_t c, bool)const   {      return static_cast<const regex_traits<wchar_t>*>(this)->translate(c, true);   }   boost::uint_fast32_t BOOST_REGEX_CALL lookup_classname(const wchar_t* first, const wchar_t* last)const   {      boost::uint_fast32_t result = static_cast<const regex_traits<wchar_t>*>(this)->lookup_classname(first, last);      if((result & base_type::char_class_upper) == base_type::char_class_upper)         result |= base_type::char_class_alpha;      return result;   }};#endif} // namespace deprecatednamespace re_detail{enum mask_type{   mask_take = 1,   mask_skip = 2,   mask_any = mask_skip | mask_take,   mask_all = mask_any};struct _narrow_type{};struct _wide_type{};template <class charT>class is_byte;template<>class is_byte<char>{public:   typedef _narrow_type width_type;};template<>class is_byte<unsigned char>{public:   typedef _narrow_type width_type;};template<>class is_byte<signed char>{public:   typedef _narrow_type width_type;};template <class charT>class is_byte{public:   typedef _wide_type width_type;};//// compiled structures//// the following defs describe the format of the compiled string////// enum syntax_element_type// describes the type of a recordenum syntax_element_type{   syntax_element_startmark = 0,   syntax_element_endmark = syntax_element_startmark + 1,   syntax_element_literal = syntax_element_endmark + 1,   syntax_element_start_line = syntax_element_literal + 1,   syntax_element_end_line = syntax_element_start_line + 1,   syntax_element_wild = syntax_element_end_line + 1,   syntax_element_match = syntax_element_wild + 1,   syntax_element_word_boundary = syntax_element_match + 1,   syntax_element_within_word = syntax_element_word_boundary + 1,   syntax_element_word_start = syntax_element_within_word + 1,   syntax_element_word_end = syntax_element_word_start + 1,   syntax_element_buffer_start = syntax_element_word_end + 1,   syntax_element_buffer_end = syntax_element_buffer_start + 1,   syntax_element_backref = syntax_element_buffer_end + 1,   syntax_element_long_set = syntax_element_backref + 1,   syntax_element_set = syntax_element_long_set + 1,   syntax_element_jump = syntax_element_set + 1,   syntax_element_alt = syntax_element_jump + 1,   syntax_element_rep = syntax_element_alt + 1,   syntax_element_combining = syntax_element_rep + 1,   syntax_element_soft_buffer_end = syntax_element_combining + 1,   syntax_element_restart_continue = syntax_element_soft_buffer_end + 1};#ifdef BOOST_REGEX_DEBUG// dwa 09/26/00 - This is needed to suppress warnings about an ambiguous conversionstd::ostream& operator<<(std::ostream&, syntax_element_type);#endifunion offset_type{   re_syntax_base* p;   std::size_t i;};//// struct re_syntax_base// base class for all syntax types:struct re_syntax_base{   syntax_element_type type;   offset_type next;   unsigned int can_be_null;};//// struct re_brace// marks start or end of (...)struct re_brace : public re_syntax_base{   int index;};//// struct re_literal// marks a literal string and// is followed by an array of charT[length]:struct re_literal : public re_syntax_base{   unsigned int length;};//// struct re_long_set// provides data for sets [...] containing// wide charactersstruct re_set_long : public re_syntax_base{   unsigned int csingles, cranges, cequivalents;   boost::uint_fast32_t cclasses;   bool isnot;};//// struct re_set// provides a map of bools for sets containing// narrow, single byte characters.struct re_set : public re_syntax_base{   unsigned char _map[256];};//// struct re_jump// provides alternative next destinationstruct re_jump : public re_syntax_base{   offset_type alt;   unsigned char _map[256];};//// struct re_repeat// provides repeat expressionsstruct re_repeat : public re_jump{   unsigned min, max;   int id;   bool leading;   bool greedy;   bool singleton;};//// enum re_jump_size_type// provides compiled size of re_jump// allowing for trailing alignment// provide this so we know how many// bytes to insertenum re_jump_size_type{   re_jump_size = (sizeof(re_jump) + padding_mask) & ~(padding_mask),   re_repeater_size = (sizeof(re_repeat) + padding_mask) & ~(padding_mask)};} // namespace re_detail//// class basic_regex// handles error codes and flagsclass BOOST_REGEX_DECL regbase{public:   enum flag_type_   {      escape_in_lists = 1,                     // '\' special inside [...]      char_classes = escape_in_lists << 1,     // [[:CLASS:]] allowed      intervals = char_classes << 1,           // {x,y} allowed      limited_ops = intervals << 1,            // all of + ? and | are normal characters      newline_alt = limited_ops << 1,          // \n is the same as |      bk_plus_qm = newline_alt << 1,           // uses \+ and \?      bk_braces = bk_plus_qm << 1,             // uses \{ and \}      bk_parens = bk_braces << 1,              // uses \( and \)      bk_refs = bk_parens << 1,                // \d allowed      bk_vbar = bk_refs << 1,                  // uses \|      use_except = bk_vbar << 1,               // exception on error      failbit = use_except << 1,               // error flag      literal = failbit << 1,                  // all characters are literals      icase = literal << 1,                    // characters are matched regardless of case      nocollate = icase << 1,                  // don't use locale specific collation      basic = char_classes | intervals | limited_ops | bk_braces | bk_parens | bk_refs,      extended = char_classes | intervals | bk_refs,      normal = escape_in_lists | char_classes | intervals | bk_refs | nocollate,      emacs = bk_braces | bk_parens | bk_refs | bk_vbar,      awk = extended | escape_in_lists,      grep = basic | newline_alt,      egrep = extended | newline_alt,      sed = basic,      perl = normal   };   typedef unsigned int flag_type;   enum restart_info   {      restart_any = 0,      restart_word = 1,      restart_line = 2,      restart_buf = 3,      restart_continue = 4,      restart_lit = 5,      restart_fixed_lit = 6   };   flag_type BOOST_REGEX_CALL flags()const   {      return _flags;   }   regbase();   regbase(const regbase& b);protected:   flag_type _flags;};//// some forward declarations:namespace re_detail{template <class iterator, class Allocator>class _priv_match_data;#if defined(BOOST_NO_STD_ITERATOR_TRAITS) || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)template <class T>struct regex_iterator_traits {  typedef typename T::iterator_category iterator_category;  typedef typename T::value_type        value_type;#if !defined(BOOST_NO_STD_ITERATOR)  typedef typename T::difference_type   difference_type;  typedef typename T::pointer           pointer;  typedef typename T::reference         reference;#else  typedef std::ptrdiff_t                difference_type;  typedef value_type*                   pointer;  typedef value_type&                   reference;#endif};template <class T>struct pointer_iterator_traits{   typedef std::ptrdiff_t difference_type;   typedef T value_type;   typedef T* pointer;   typedef T& reference;   typedef std::random_access_iterator_tag iterator_category;};template <class T>struct const_pointer_iterator_traits{   typedef std::ptrdiff_t difference_type;   typedef T value_type;   typedef const T* pointer;   typedef const T& reference;   typedef std::random_access_iterator_tag iterator_category;};template<>struct regex_iterator_traits<char*> : pointer_iterator_traits<char>{};template<>struct regex_iterator_traits<const char*> : const_pointer_iterator_traits<char>{};template<>struct regex_iterator_traits<wchar_t*> : pointer_iterator_traits<wchar_t>{};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?