regex_format.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 682 行 · 第 1/2 页
HPP
682 行
case traits_type::syntax_x: ++fmt; if(fmt == fmt_end) { *out = *--fmt; ++out; return out; } // maybe have \x{ddd} if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)) == traits_type::syntax_open_brace) { ++fmt; if(fmt == fmt_end) { fmt -= 2; *out = *fmt; ++out; ++fmt; continue; } if(traits_inst.is_class(*fmt, traits_type::char_class_xdigit) == false) { fmt -= 2; *out = *fmt; ++out; ++fmt; continue; } c = (charT)traits_inst.toi(fmt, fmt_end, -16); if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)) != traits_type::syntax_close_brace) { while(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*fmt)) != traits_type::syntax_slash) --fmt; ++fmt; *out = *fmt; ++out; ++fmt; continue; } ++fmt; break; } else { if(traits_inst.is_class(*fmt, traits_type::char_class_xdigit) == false) { --fmt; *out = *fmt; ++out; ++fmt; continue; } c = (charT)traits_inst.toi(fmt, fmt_end, -16); } break; case traits_type::syntax_c: ++fmt; if(fmt == fmt_end) { --fmt; *out = *fmt; ++out; return out; } if(((typename traits_type::uchar_type)(*fmt) < (typename traits_type::uchar_type)'@') || ((typename traits_type::uchar_type)(*fmt) > (typename traits_type::uchar_type)127) ) { --fmt; *out = *fmt; ++out; ++fmt; break; } c = (charT)((typename traits_type::uchar_type)(*fmt) - (typename traits_type::uchar_type)'@'); ++fmt; break; case traits_type::syntax_e: c = (charT)27; ++fmt; break; case traits_type::syntax_digit: if(flags & format_sed) goto expand_sub; else c = (charT)traits_inst.toi(fmt, fmt_end, -8); break; case traits_type::syntax_u: ++fmt; if(flags & format_sed) break; case_flags = case_oneupper; continue; case traits_type::syntax_l: ++fmt; if(flags & format_sed) break; case_flags = case_onelower; continue; case traits_type::syntax_U: ++fmt; if(flags & format_sed) break; case_flags = case_allupper; continue; case traits_type::syntax_L: ++fmt; if(flags & format_sed) break; case_flags = case_alllower; continue; case traits_type::syntax_E: ++fmt; if(flags & format_sed) break; case_flags = case_nochange; continue; default: //c = *fmt; ++fmt; } *out = c; ++out; continue; } case traits_type::syntax_open_bracket: if(0 == (flags & format_all)) { *out = *fmt; ++out; ++fmt; continue; } else { ++fmt; // recurse oi_assign(&out, _reg_format_aux(out, m, fmt, flags, traits_inst, case_flags)); continue; } case traits_type::syntax_close_bracket: if(0 == (flags & format_all)) { *out = *fmt; ++out; ++fmt; continue; } else { ++fmt; // return from recursion return out; } case traits_type::syntax_colon: if(flags & regex_constants::format_is_if) { ++fmt; return out; } *out = *fmt; ++out; ++fmt; continue; case traits_type::syntax_question: { if(0 == (flags & format_all)) { *out = *fmt; ++out; ++fmt; continue; } else { ++fmt; if(*fmt == 0) { --fmt; *out = *fmt; ++out; ++fmt; return out; } unsigned int id = traits_inst.toi(fmt, fmt_end, 10); if(m[id].matched) { oi_assign(&out, _reg_format_aux(out, m, fmt, flags | regex_constants::format_is_if, traits_inst, case_flags)); if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*(fmt-1))) == traits_type::syntax_colon) re_skip_format(fmt, traits_inst); } else { re_skip_format(fmt, traits_inst); if(traits_inst.syntax_type((traits_size_type)(traits_uchar_type)(*(fmt-1))) == traits_type::syntax_colon) oi_assign(&out, _reg_format_aux(out, m, fmt, flags | regex_constants::format_is_if, traits_inst, case_flags)); } return out; } } default:default_opt: if((flags & format_sed) && (*fmt == '&')) { oi_assign(&out, re_copy_out(out, Iterator(m[0].first), Iterator(m[0].second), traits_inst, case_flags)); ++fmt; continue; } output_char(out, *fmt, traits_inst, case_flags); ++out; ++fmt; } } return out;#ifdef __BORLANDC__#pragma option pop#endif}#if defined(BOOST_REGEX_NO_TEMPLATE_SWITCH_MERGE)} // namespace#endiftemplate <class S>class string_out_iterator{ S* out;public: typedef typename S::difference_type difference_type; typedef typename S::value_type value_type; typedef typename S::pointer pointer; typedef typename S::reference reference; typedef std::output_iterator_tag iterator_category; string_out_iterator(S& s) : out(&s) {} string_out_iterator& operator++() { return *this; } string_out_iterator& operator++(int) { return *this; } string_out_iterator& operator*() { return *this; } string_out_iterator& operator=(typename S::value_type v) { out->append(1, v); return *this; }};template <class OutputIterator, class Iterator, class charT, class Allocator, class traits_type>class merge_out_predicate{ OutputIterator* out; Iterator* last; const charT* fmt; match_flag_type flags; const traits_type* pt; // rebind allocator to correct type: typedef typename detail::rebind_allocator<sub_match<Iterator>, Allocator>::type alloc_type;public: merge_out_predicate(OutputIterator& o, Iterator& pi, const charT* f, match_flag_type format_flags, const traits_type& p) : out(&o), last(&pi), fmt(f), flags(format_flags), pt(&p){} ~merge_out_predicate() {} bool BOOST_REGEX_CALL operator()(const boost::match_results<Iterator, alloc_type>& m) { const charT* f = fmt; case_flags_type cf = case_nochange; if(0 == (flags & format_no_copy)) { oi_assign(out, re_copy_out( *out, Iterator(m[-1].first), Iterator(m[-1].second), *pt, cf)); } oi_assign(out, _reg_format_aux(*out, m, f, flags, *pt, cf)); *last = m[-2].first; return flags & format_first_only ? false : true; }};} // namespace re_detailtemplate <class OutputIterator, class Iterator, class Allocator, class charT>OutputIterator regex_format(OutputIterator out, const match_results<Iterator, Allocator>& m, const charT* fmt, match_flag_type flags = format_all ){ regex_traits<charT> t; re_detail::case_flags_type cf = re_detail::case_nochange; return re_detail::_reg_format_aux(out, m, fmt, flags, t, cf);}template <class OutputIterator, class Iterator, class Allocator, class charT>OutputIterator regex_format(OutputIterator out, const match_results<Iterator, Allocator>& m, const std::basic_string<charT>& fmt, match_flag_type flags = format_all ){ regex_traits<charT> t; const charT* start = fmt.c_str(); re_detail::case_flags_type cf = re_detail::case_nochange; return re_detail::_reg_format_aux(out, m, start, flags, t, cf);}template <class Iterator, class Allocator, class charT>std::basic_string<charT> regex_format(const match_results<Iterator, Allocator>& m, const charT* fmt, match_flag_type flags = format_all){ std::basic_string<charT> result; re_detail::string_out_iterator<std::basic_string<charT> > i(result); regex_format(i, m, fmt, flags); return result;}template <class Iterator, class Allocator, class charT>std::basic_string<charT> regex_format(const match_results<Iterator, Allocator>& m, const std::basic_string<charT>& fmt, match_flag_type flags = format_all){ std::basic_string<charT> result; re_detail::string_out_iterator<std::basic_string<charT> > i(result); regex_format(i, m, fmt.c_str(), flags); return result;}#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_SUFFIX#endif} // namespace boost#endif // BOOST_REGEX_FORMAT_HPP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?