123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646 |
- // Boost string_algo library regex.hpp header file ---------------------------//
- // Copyright Pavol Droba 2002-2003.
- //
- // Distributed under 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)
- // See http://www.boost.org/ for updates, documentation, and revision history.
- #ifndef BOOST_STRING_REGEX_HPP
- #define BOOST_STRING_REGEX_HPP
- #include <boost/algorithm/string/config.hpp>
- #include <boost/regex.hpp>
- #include <boost/range/iterator_range_core.hpp>
- #include <boost/range/begin.hpp>
- #include <boost/range/end.hpp>
- #include <boost/range/iterator.hpp>
- #include <boost/range/as_literal.hpp>
- #include <boost/algorithm/string/find_format.hpp>
- #include <boost/algorithm/string/regex_find_format.hpp>
- #include <boost/algorithm/string/formatter.hpp>
- #include <boost/algorithm/string/iter_find.hpp>
- /*! \file
- Defines regex variants of the algorithms.
- */
- namespace boost {
- namespace algorithm {
- // find_regex -----------------------------------------------//
- //! Find regex algorithm
- /*!
- Search for a substring matching the given regex in the input.
-
- \param Input A container which will be searched.
- \param Rx A regular expression
- \param Flags Regex options
- \return
- An \c iterator_range delimiting the match.
- Returned iterator is either \c RangeT::iterator or
- \c RangeT::const_iterator, depending on the constness of
- the input parameter.
- \note This function provides the strong exception-safety guarantee
- */
- template<
- typename RangeT,
- typename CharT,
- typename RegexTraitsT>
- inline iterator_range<
- BOOST_STRING_TYPENAME range_iterator<RangeT>::type >
- find_regex(
- RangeT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
- return ::boost::algorithm::regex_finder(Rx,Flags)(
- ::boost::begin(lit_input), ::boost::end(lit_input) );
- }
- // replace_regex --------------------------------------------------------------------//
- //! Replace regex algorithm
- /*!
- Search for a substring matching given regex and format it with
- the specified format.
- The result is a modified copy of the input. It is returned as a sequence
- or copied to the output iterator.
- \param Output An output iterator to which the result will be copied
- \param Input An input string
- \param Rx A regular expression
- \param Format Regex format definition
- \param Flags Regex options
- \return An output iterator pointing just after the last inserted character or
- a modified copy of the input
- \note The second variant of this function provides the strong exception-safety guarantee
- */
- template<
- typename OutputIteratorT,
- typename RangeT,
- typename CharT,
- typename RegexTraitsT,
- typename FormatStringTraitsT, typename FormatStringAllocatorT >
- inline OutputIteratorT replace_regex_copy(
- OutputIteratorT Output,
- const RangeT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
- match_flag_type Flags=match_default | format_default )
- {
- return ::boost::algorithm::find_format_copy(
- Output,
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::regex_formatter( Format, Flags ) );
- }
- //! Replace regex algorithm
- /*!
- \overload
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT,
- typename FormatStringTraitsT, typename FormatStringAllocatorT >
- inline SequenceT replace_regex_copy(
- const SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
- match_flag_type Flags=match_default | format_default )
- {
- return ::boost::algorithm::find_format_copy(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::regex_formatter( Format, Flags ) );
- }
- //! Replace regex algorithm
- /*!
- Search for a substring matching given regex and format it with
- the specified format. The input string is modified in-place.
- \param Input An input string
- \param Rx A regular expression
- \param Format Regex format definition
- \param Flags Regex options
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT,
- typename FormatStringTraitsT, typename FormatStringAllocatorT >
- inline void replace_regex(
- SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
- match_flag_type Flags=match_default | format_default )
- {
- ::boost::algorithm::find_format(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::regex_formatter( Format, Flags ) );
- }
- // replace_all_regex --------------------------------------------------------------------//
- //! Replace all regex algorithm
- /*!
- Format all substrings, matching given regex, with the specified format.
- The result is a modified copy of the input. It is returned as a sequence
- or copied to the output iterator.
- \param Output An output iterator to which the result will be copied
- \param Input An input string
- \param Rx A regular expression
- \param Format Regex format definition
- \param Flags Regex options
- \return An output iterator pointing just after the last inserted character or
- a modified copy of the input
- \note The second variant of this function provides the strong exception-safety guarantee
- */
- template<
- typename OutputIteratorT,
- typename RangeT,
- typename CharT,
- typename RegexTraitsT,
- typename FormatStringTraitsT, typename FormatStringAllocatorT >
- inline OutputIteratorT replace_all_regex_copy(
- OutputIteratorT Output,
- const RangeT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
- match_flag_type Flags=match_default | format_default )
- {
- return ::boost::algorithm::find_format_all_copy(
- Output,
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::regex_formatter( Format, Flags ) );
- }
- //! Replace all regex algorithm
- /*!
- \overload
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT,
- typename FormatStringTraitsT, typename FormatStringAllocatorT >
- inline SequenceT replace_all_regex_copy(
- const SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
- match_flag_type Flags=match_default | format_default )
- {
- return ::boost::algorithm::find_format_all_copy(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::regex_formatter( Format, Flags ) );
- }
- //! Replace all regex algorithm
- /*!
- Format all substrings, matching given regex, with the specified format.
- The input string is modified in-place.
- \param Input An input string
- \param Rx A regular expression
- \param Format Regex format definition
- \param Flags Regex options
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT,
- typename FormatStringTraitsT, typename FormatStringAllocatorT >
- inline void replace_all_regex(
- SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
- match_flag_type Flags=match_default | format_default )
- {
- ::boost::algorithm::find_format_all(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::regex_formatter( Format, Flags ) );
- }
- // erase_regex --------------------------------------------------------------------//
- //! Erase regex algorithm
- /*!
- Remove a substring matching given regex from the input.
- The result is a modified copy of the input. It is returned as a sequence
- or copied to the output iterator.
- \param Output An output iterator to which the result will be copied
- \param Input An input string
- \param Rx A regular expression
- \param Flags Regex options
- \return An output iterator pointing just after the last inserted character or
- a modified copy of the input
- \note The second variant of this function provides the strong exception-safety guarantee
- */
- template<
- typename OutputIteratorT,
- typename RangeT,
- typename CharT,
- typename RegexTraitsT >
- inline OutputIteratorT erase_regex_copy(
- OutputIteratorT Output,
- const RangeT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- return ::boost::algorithm::find_format_copy(
- Output,
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::empty_formatter( Input ) );
- }
- //! Erase regex algorithm
- /*!
- \overload
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT >
- inline SequenceT erase_regex_copy(
- const SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- return ::boost::algorithm::find_format_copy(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::empty_formatter( Input ) );
- }
- //! Erase regex algorithm
- /*!
- Remove a substring matching given regex from the input.
- The input string is modified in-place.
- \param Input An input string
- \param Rx A regular expression
- \param Flags Regex options
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT >
- inline void erase_regex(
- SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- ::boost::algorithm::find_format(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::empty_formatter( Input ) );
- }
- // erase_all_regex --------------------------------------------------------------------//
- //! Erase all regex algorithm
- /*!
- Erase all substrings, matching given regex, from the input.
- The result is a modified copy of the input. It is returned as a sequence
- or copied to the output iterator.
-
- \param Output An output iterator to which the result will be copied
- \param Input An input string
- \param Rx A regular expression
- \param Flags Regex options
- \return An output iterator pointing just after the last inserted character or
- a modified copy of the input
- \note The second variant of this function provides the strong exception-safety guarantee
- */
- template<
- typename OutputIteratorT,
- typename RangeT,
- typename CharT,
- typename RegexTraitsT >
- inline OutputIteratorT erase_all_regex_copy(
- OutputIteratorT Output,
- const RangeT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- return ::boost::algorithm::find_format_all_copy(
- Output,
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::empty_formatter( Input ) );
- }
- //! Erase all regex algorithm
- /*!
- \overload
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT >
- inline SequenceT erase_all_regex_copy(
- const SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- return ::boost::algorithm::find_format_all_copy(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::empty_formatter( Input ) );
- }
- //! Erase all regex algorithm
- /*!
- Erase all substrings, matching given regex, from the input.
- The input string is modified in-place.
- \param Input An input string
- \param Rx A regular expression
- \param Flags Regex options
- */
- template<
- typename SequenceT,
- typename CharT,
- typename RegexTraitsT>
- inline void erase_all_regex(
- SequenceT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- ::boost::algorithm::find_format_all(
- Input,
- ::boost::algorithm::regex_finder( Rx, Flags ),
- ::boost::algorithm::empty_formatter( Input ) );
- }
- // find_all_regex ------------------------------------------------------------------//
- //! Find all regex algorithm
- /*!
- This algorithm finds all substrings matching the give regex
- in the input.
-
- Each part is copied and added as a new element to the output container.
- Thus the result container must be able to hold copies
- of the matches (in a compatible structure like std::string) or
- a reference to it (e.g. using the iterator range class).
- Examples of such a container are \c std::vector<std::string>
- or \c std::list<boost::iterator_range<std::string::iterator>>
- \param Result A container that can hold copies of references to the substrings.
- \param Input A container which will be searched.
- \param Rx A regular expression
- \param Flags Regex options
- \return A reference to the result
- \note Prior content of the result will be overwritten.
- \note This function provides the strong exception-safety guarantee
- */
- template<
- typename SequenceSequenceT,
- typename RangeT,
- typename CharT,
- typename RegexTraitsT >
- inline SequenceSequenceT& find_all_regex(
- SequenceSequenceT& Result,
- const RangeT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- return ::boost::algorithm::iter_find(
- Result,
- Input,
- ::boost::algorithm::regex_finder(Rx,Flags) );
- }
- // split_regex ------------------------------------------------------------------//
- //! Split regex algorithm
- /*!
- Tokenize expression. This function is equivalent to C strtok. Input
- sequence is split into tokens, separated by separators. Separator
- is an every match of the given regex.
- Each part is copied and added as a new element to the output container.
- Thus the result container must be able to hold copies
- of the matches (in a compatible structure like std::string) or
- a reference to it (e.g. using the iterator range class).
- Examples of such a container are \c std::vector<std::string>
- or \c std::list<boost::iterator_range<std::string::iterator>>
-
- \param Result A container that can hold copies of references to the substrings.
- \param Input A container which will be searched.
- \param Rx A regular expression
- \param Flags Regex options
- \return A reference to the result
- \note Prior content of the result will be overwritten.
- \note This function provides the strong exception-safety guarantee
- */
- template<
- typename SequenceSequenceT,
- typename RangeT,
- typename CharT,
- typename RegexTraitsT >
- inline SequenceSequenceT& split_regex(
- SequenceSequenceT& Result,
- const RangeT& Input,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- return ::boost::algorithm::iter_split(
- Result,
- Input,
- ::boost::algorithm::regex_finder(Rx,Flags) );
- }
- // join_if ------------------------------------------------------------------//
- #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
- //! Conditional join algorithm
- /*!
- This algorithm joins all strings in a 'list' into one long string.
- Segments are concatenated by given separator. Only segments that
- match the given regular expression will be added to the result
- This is a specialization of join_if algorithm.
- \param Input A container that holds the input strings. It must be a container-of-containers.
- \param Separator A string that will separate the joined segments.
- \param Rx A regular expression
- \param Flags Regex options
- \return Concatenated string.
- \note This function provides the strong exception-safety guarantee
- */
- template<
- typename SequenceSequenceT,
- typename Range1T,
- typename CharT,
- typename RegexTraitsT >
- inline typename range_value<SequenceSequenceT>::type
- join_if(
- const SequenceSequenceT& Input,
- const Range1T& Separator,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- // Define working types
- typedef typename range_value<SequenceSequenceT>::type ResultT;
- typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
- // Parse input
- InputIteratorT itBegin=::boost::begin(Input);
- InputIteratorT itEnd=::boost::end(Input);
- // Construct container to hold the result
- ResultT Result;
- // Roll to the first element that will be added
- while(
- itBegin!=itEnd &&
- !::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
- // Add this element
- if(itBegin!=itEnd)
- {
- detail::insert(Result, ::boost::end(Result), *itBegin);
- ++itBegin;
- }
- for(;itBegin!=itEnd; ++itBegin)
- {
- if(::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
- {
- // Add separator
- detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
- // Add element
- detail::insert(Result, ::boost::end(Result), *itBegin);
- }
- }
- return Result;
- }
- #else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
- //! Conditional join algorithm
- /*!
- This algorithm joins all strings in a 'list' into one long string.
- Segments are concatenated by given separator. Only segments that
- match the given regular expression will be added to the result
- This is a specialization of join_if algorithm.
- \param Input A container that holds the input strings. It must be a container-of-containers.
- \param Separator A string that will separate the joined segments.
- \param Rx A regular expression
- \param Flags Regex options
- \return Concatenated string.
- \note This function provides the strong exception-safety guarantee
- */
- template<
- typename SequenceSequenceT,
- typename Range1T,
- typename CharT,
- typename RegexTraitsT >
- inline typename range_value<SequenceSequenceT>::type
- join_if_regex(
- const SequenceSequenceT& Input,
- const Range1T& Separator,
- const basic_regex<CharT, RegexTraitsT>& Rx,
- match_flag_type Flags=match_default )
- {
- // Define working types
- typedef typename range_value<SequenceSequenceT>::type ResultT;
- typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
- // Parse input
- InputIteratorT itBegin=::boost::begin(Input);
- InputIteratorT itEnd=::boost::end(Input);
- // Construct container to hold the result
- ResultT Result;
- // Roll to the first element that will be added
- while(
- itBegin!=itEnd &&
- !::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
- // Add this element
- if(itBegin!=itEnd)
- {
- detail::insert(Result, ::boost::end(Result), *itBegin);
- ++itBegin;
- }
- for(;itBegin!=itEnd; ++itBegin)
- {
- if(::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
- {
- // Add separator
- detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
- // Add element
- detail::insert(Result, ::boost::end(Result), *itBegin);
- }
- }
- return Result;
- }
- #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
- } // namespace algorithm
- // pull names into the boost namespace
- using algorithm::find_regex;
- using algorithm::replace_regex;
- using algorithm::replace_regex_copy;
- using algorithm::replace_all_regex;
- using algorithm::replace_all_regex_copy;
- using algorithm::erase_regex;
- using algorithm::erase_regex_copy;
- using algorithm::erase_all_regex;
- using algorithm::erase_all_regex_copy;
- using algorithm::find_all_regex;
- using algorithm::split_regex;
- #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
- using algorithm::join_if;
- #else // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
- using algorithm::join_if_regex;
- #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
- } // namespace boost
- #endif // BOOST_STRING_REGEX_HPP
|