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_typevalue_type
; typedef typename iterator_traits<BidirectionalIterator>::difference_typedifference_type
; typedef BidirectionalIteratoriterator
; boolmatched
; difference_typelength
()const;operator basic_string<value_type>
()const; basic_string<value_type>str
()const; intcompare
(const sub_match& s)const; intcompare
(const basic_string<value_type>& s)const; intcompare
(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> booloperator ==
(const sub_match<BidirectionalIterator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator !=
(const sub_match<BidirectionalIterator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator <
(const sub_match<BidirectionalIterator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator <=
(const sub_match<BidirectionalIterator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator >=
(const sub_match<BidirectionalIterator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator >
(const sub_match<BidirectionalIterator>& lhs, const sub_match<BidirectionalIterator>& rhs); // // basic_string との比較: // template <class BidirectionalIterator, class traits, class Allocator> booloperator ==
(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator !=
(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator <
(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator >
(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator >=
(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator <=
(const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator ==
(const sub_match<BidirectionalIterator>& lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator !=
(const sub_match<BidirectionalIterator>& lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator <
(const sub_match<BidirectionalIterator>& lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator >
(const sub_match<BidirectionalIterator>& lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator >=
(const sub_match<BidirectionalIterator>& lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& rhs); template <class BidirectionalIterator, class traits, class Allocator> booloperator <=
(const sub_match<BidirectionalIterator>& lhs, const std::basic_string<iterator_traits<BidirectionalIterator>::value_type, traits, Allocator>& rhs); // // 文字列ポインタとの比較: // template <class BidirectionalIterator> booloperator ==
(typename iterator_traits<BidirectionalIterator>::value_type const* lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator !=
(typename iterator_traits<BidirectionalIterator>::value_type const* lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator <
(typename iterator_traits<BidirectionalIterator>::value_type const* lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator >
(typename iterator_traits<BidirectionalIterator>::value_type const* lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator >=
(typename iterator_traits<BidirectionalIterator>::value_type const* lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator <=
(typename iterator_traits<BidirectionalIterator>::value_type const* lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator ==
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const* rhs); template <class BidirectionalIterator> booloperator !=
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const* rhs); template <class BidirectionalIterator> booloperator <
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const* rhs); template <class BidirectionalIterator> booloperator >
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const* rhs); template <class BidirectionalIterator> booloperator >=
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const* rhs); template <class BidirectionalIterator> booloperator <=
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const* rhs); // // 1 文字との比較: // template <class BidirectionalIterator> booloperator ==
(typename iterator_traits<BidirectionalIterator>::value_type const& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator !=
(typename iterator_traits<BidirectionalIterator>::value_type const& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator <
(typename iterator_traits<BidirectionalIterator>::value_type const& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator >
(typename iterator_traits<BidirectionalIterator>::value_type const& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator >=
(typename iterator_traits<BidirectionalIterator>::value_type const& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator <=
(typename iterator_traits<BidirectionalIterator>::value_type const& lhs, const sub_match<BidirectionalIterator>& rhs); template <class BidirectionalIterator> booloperator ==
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const& rhs); template <class BidirectionalIterator> booloperator !=
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const& rhs); template <class BidirectionalIterator> booloperator <
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const& rhs); template <class BidirectionalIterator> booloperator >
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const& rhs); template <class BidirectionalIterator> booloperator >=
(const sub_match<BidirectionalIterator>& lhs, typename iterator_traits<BidirectionalIterator>::value_type const& rhs); template <class BidirectionalIterator> booloperator <=
(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)