sub_match
-
template<class BidirectionalIterator>
class sub_match : public std::pair<BidirectionalIterator, BidirectionalIterator> 正規表現が他の多くの単純なパターンマッチアルゴリズムと異なるのは、マッチを発見するだけでなく、部分式のマッチを生成する点である。各部分式はパターン中の括弧の組
(...)により、その範囲が与えられる。部分式マッチをユーザに知らせるために何らかの方法が必要である。部分式マッチの添字付きコレクションとして振舞うmatch_resultsクラスの定義がそれであり、各部分式マッチはsub_match型オブジェクトが保持する。sub_match型のオブジェクトはmatch_results型のオブジェクトの配列要素としてのみ取得可能である。sub_match型のオブジェクトはstd::basic_string、const charT*、const charT型のオブジェクトと比較可能である。sub_match型のオブジェクトはstd::basic_string、const charT*、const charT型のオブジェクトに追加して新しいstd::basic_stringオブジェクトを生成可能である。sub_match型のオブジェクトで示されるマーク済み部分式が正規表現マッチに関与していればmatchedメンバは真と評価され、メンバfirstとsecondはマッチを形成する文字範囲 [first,second) を示す。それ以外の場合はmatchedは偽であり、メンバfirstとsecondは未定義の値となる。sub_match型のオブジェクトで示されるマーク済み部分式が繰り返しになっている場合、そのsub_matchオブジェクトが表現するのは最後の繰り返しに対応するマッチである。すべての繰り返しに対応するすべての捕捉の完全なセットはcapturesメンバ関数でアクセス可能である(効率に関して深刻な問題があり、この機能は明示的に有効にしなければならない)。sub_match型のオブジェクトが部分式 0(マッチ全体)を表現する場合、メンバmatchedは常に真である。ただし正規表現アルゴリズムにフラグmatch_partialを渡して結果が部分マッチとなる場合はこの限りではなく、メンバmatchedは偽、メンバfirstとsecondは部分マッチを形成する文字範囲を表現する。
#include <boost/regex.hpp>
namespace boost{
template <class BidirectionalIterator>
class sub_match;
typedef sub_match<const char*> csub_match;
typedef sub_match<const wchar_t*> wcsub_match;
typedef sub_match<std::string::const_iterator> ssub_match;
typedef sub_match<std::wstring::const_iterator> wssub_match;
template <class BidirectionalIterator>
class sub_match : public std::pair<BidirectionalIterator, BidirectionalIterator>
{
public:
typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
typedef BidirectionalIterator iterator;
bool matched;
difference_type length()const;
operator basic_string<value_type>()const;
basic_string<value_type> str()const;
int compare(const sub_match& s)const;
int compare(const basic_string<value_type>& s)const;
int compare(const value_type* s)const;
#ifdef BOOST_REGEX_MATCH_EXTRA
typedef {implementation-private capture_sequence_type;
const capture_sequence_type& captures()const;
#endif
};
//
// sub_match 同士の比較:
//
template <class BidirectionalIterator>
bool operator == (const sub_match<BidirectionalIterator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator != (const sub_match<BidirectionalIterator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator < (const sub_match<BidirectionalIterator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator > (const sub_match<BidirectionalIterator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
//
// basic_string との比較:
//
template <class BidirectionalIterator, class traits, class Allocator>
bool operator == (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator != (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator < (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator > (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator >= (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator <= (const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator == (const sub_match<BidirectionalIterator>& lhs,
const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator != (const sub_match<BidirectionalIterator>& lhs,
const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator < (const sub_match<BidirectionalIterator>& lhs,
const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator > (const sub_match<BidirectionalIterator>& lhs,
const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& rhs);
template <class BidirectionalIterator, class traits, class Allocator>
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
const std::basic_string<iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& rhs);
//
// 文字列ポインタとの比較:
//
template <class BidirectionalIterator>
bool operator == (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator != (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator < (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator > (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator >= (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator <= (typename iterator_traits<BidirectionalIterator>::value_type const* lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator == (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
template <class BidirectionalIterator>
bool operator != (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
template <class BidirectionalIterator>
bool operator < (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
template <class BidirectionalIterator>
bool operator > (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
template <class BidirectionalIterator>
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
template <class BidirectionalIterator>
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const* rhs);
//
// 1 文字との比較:
//
template <class BidirectionalIterator>
bool operator == (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator != (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator < (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator > (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator >= (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator <= (typename iterator_traits<BidirectionalIterator>::value_type const& lhs,
const sub_match<BidirectionalIterator>& rhs);
template <class BidirectionalIterator>
bool operator == (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
template <class BidirectionalIterator>
bool operator != (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
template <class BidirectionalIterator>
bool operator < (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
template <class BidirectionalIterator>
bool operator > (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
template <class BidirectionalIterator>
bool operator >= (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
template <class BidirectionalIterator>
bool operator <= (const sub_match<BidirectionalIterator>& lhs,
typename iterator_traits<BidirectionalIterator>::value_type const& rhs);
//
// 加算演算子:
//
template <class BidirectionalIterator, class traits, class Allocator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>
operator + (const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& s,
const sub_match<BidirectionalIterator>& m);
template <class BidirectionalIterator, class traits, class Allocator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>
operator + (const sub_match<BidirectionalIterator>& m,
const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type,
traits,
Allocator>& s);
template <class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
operator + (typename iterator_traits<BidirectionalIterator>::value_type const* s,
const sub_match<BidirectionalIterator>& m);
template <class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
operator + (const sub_match<BidirectionalIterator>& m,
typename iterator_traits<BidirectionalIterator>::value_type const * s);
template <class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
operator + (typename iterator_traits<BidirectionalIterator>::value_type const& s,
const sub_match<BidirectionalIterator>& m);
template <class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
operator + (const sub_match<BidirectionalIterator>& m,
typename iterator_traits<BidirectionalIterator>::value_type const& s);
template <class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type>
operator + (const sub_match<BidirectionalIterator>& m1,
const sub_match<BidirectionalIterator>& m2);
//
// ストリーム挿入子:
//
template <class charT, class traits, class BidirectionalIterator>
basic_ostream<charT, traits>&
operator << (basic_ostream<charT, traits>& os,
const sub_match<BidirectionalIterator>& m);
} // namespace boost
説明
メンバ
-
typedef BidirectionalIterator iterator
イテレータ型。
-
bool matched
この部分式がマッチしているかを示す論理値。
-
difference_type length() const
-
operator basic_string<value_type>() const
- 効果
*this を文字列に変換する。
(matched ?basic_string<value_type>(first, second):basic_string<value_type>())を返す。
-
basic_string str() const
- 効果
*this の文字列表現を返す。
(matched ?basic_string<value_type>(first, second):basic_string<value_type>())と同じ。
-
int compare(const basic_string<value_type> &s) const
-
int compare(const value_type *s) const
-
typedef implementation_private capture_sequence_type
- 効果
標準ライブラリ Sequence の要件(21.1.1 および表 68 の操作)を満たす実装固有の型を定義する。その
value_typeはsub_match<BidirectionalIterator>である。この型がstd::vector<sub_match<BidirectionalIterator> >となる可能性もあるが、それに依存すべきではない。
-
const capture_sequence_type &captures() const
- 効果
この部分式に対するすべての捕捉を格納したシーケンスを返す。
- 事前条件
BOOST_REGEX_MATCH_EXTRAを使ってライブラリをビルドしていなければ、このメンバ関数は定義されない。また正規表現マッチ関数(regex_match、regex_search、regex_iterator、regex_token_iterator)にフラグmatch_extraを渡していなければ、有用な情報を返さない。- 根拠
この機能を有効にするといくつか影響がある。
sub_matchがより多くのメモリを占有し、複雑な正規表現をマッチする場合にすぐにメモリやスタック空間の不足に陥る。match_extraを使用しない場合であっても、処理する機能(例えば独立部分式)によってはマッチアルゴリズムの効率が落ちる。match_extraを使用するとさらに効率が落ちる(速度が低下する)。ほとんどの場合、さらに必要なメモリ割り当てが起こる。
sub_match 非メンバ演算子
-
template<class BidirectionalIterator>
bool operator==(const sub_match<BidirectionalIterator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator!=(const sub_match<BidirectionalIterator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator<<(const sub_match<BidirectionalIterator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator<=(const sub_match<BidirectionalIterator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator>=(const sub_match<BidirectionalIterator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator>(const sub_match<BidirectionalIterator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator==(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator!=(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator<<(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator>(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator>=(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator<=(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator==(const sub_match<BidirectionalIterator> &lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator!=(const sub_match<BidirectionalIterator> &lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator<(const sub_match<BidirectionalIterator> &lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator>(const sub_match<BidirectionalIterator> &lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator>=(const sub_match<BidirectionalIterator> &lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
bool operator<=(const sub_match<BidirectionalIterator> &lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &rhs)
-
template<class BidirectionalIterator>
bool operator==(typename iterator_traits<BidirectionalIterator>::value_type const *lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator!=(typename iterator_traits<BidirectionalIterator>::value_type const *lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator<(typename iterator_traits<BidirectionalIterator>::value_type const *lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator>(typename iterator_traits<BidirectionalIterator>::value_type const *lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator>=(typename iterator_traits<BidirectionalIterator>::value_type const *lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator<=(typename iterator_traits<BidirectionalIterator>::value_type const *lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator==(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const *rhs)
-
template<class BidirectionalIterator>
bool operator!=(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const *rhs)
-
template<class BidirectionalIterator>
bool operator<(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const *rhs)
-
template<class BidirectionalIterator>
bool operator>(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const *rhs)
-
template<class BidirectionalIterator>
bool operator>=(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const *rhs)
-
template<class BidirectionalIterator>
bool operator<=(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const *rhs)
-
template<class BidirectionalIterator>
bool operator==(typename iterator_traits<BidirectionalIterator>::value_type const &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator!=(typename iterator_traits<BidirectionalIterator>::value_type const &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator<(typename iterator_traits<BidirectionalIterator>::value_type const &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator>(typename iterator_traits<BidirectionalIterator>::value_type const &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator>=(typename iterator_traits<BidirectionalIterator>::value_type const &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator<=(typename iterator_traits<BidirectionalIterator>::value_type const &lhs, const sub_match<BidirectionalIterator> &rhs)
-
template<class BidirectionalIterator>
bool operator==(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const &rhs)
-
template<class BidirectionalIterator>
bool operator!=(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const &rhs)
-
template<class BidirectionalIterator>
bool operator<<(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const &rhs)
-
template<class BidirectionalIterator>
bool operator>(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const &rhs)
-
template<class BidirectionalIterator>
bool operator>=(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const &rhs)
-
template<class BidirectionalIterator>
bool operator<=(const sub_match<BidirectionalIterator> &lhs, typename iterator_traits<BidirectionalIterator>::value_type const &rhs)
-
template<class BidirectionalIterator, class traits, class Allocator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> operator+(const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &s, const sub_match<BidirectionalIterator> &m) sub_matchの加算演算子により、basic_stringに追加可能な型に対してsub_matchを追加することができ、結果として新しい文字列を得る。
-
template<class BidirectionalIterator, class traits, class Allocator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> operator+(const sub_match<BidirectionalIterator> &m, const std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type, traits, Allocator> &s)
-
template<class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> operator+(typename iterator_traits<BidirectionalIterator>::value_type const *s, const sub_match<BidirectionalIterator> &m)
-
template<class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> operator+(const sub_match<BidirectionalIterator> &m, typename iterator_traits<BidirectionalIterator>::value_type const *s)
-
template<class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> operator+(typename iterator_traits<BidirectionalIterator>::value_type const &s, const sub_match<BidirectionalIterator> &m)
-
template<class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> operator+(const sub_match<BidirectionalIterator> &m, typename iterator_traits<BidirectionalIterator>::value_type const &s)
-
template<class BidirectionalIterator>
std::basic_string<typename iterator_traits<BidirectionalIterator>::value_type> operator+(const sub_match<BidirectionalIterator> &m1, const sub_match<BidirectionalIterator> &m2)