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 + -
显示快捷键?