namespace std {
template <class BidirectionalIterator>
class sub_match : public pair<BidirectionalIterator, BidirectionalIterator>;
using csub_match = sub_match<const char*>;
using wcsub_match = sub_match<const wchar_t*>;
using ssub_match = sub_match<string::const_iterator>;
using wssub_match = sub_match<wstring::const_iterator>;
}
概要
クラステンプレート sub_match
は、文字列が正規表現にマッチした際に、その正規表現がマッチした範囲、あるいは、その正規表現内のあるグループがマッチした範囲を表す。
sub_match
は pair
から public 継承している。
メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++11 |
length |
マッチした文字列の長さを返す。 | C++11 |
operator string_type |
マッチした文字列を string_type 型にキャストする。 |
C++11 |
str |
マッチした文字列を string_type 型で返す。キャストと同じ。 |
C++11 |
compare |
マッチした文字列を比較する。 | C++11 |
注:上記の他、オブジェクトの内容を交換するメンバ関数 swap
もあるが、pair
から継承したものであるため、メンバ変数 matched
の内容は交換しないため注意が必要。
メンバ変数
名前 | 型 | 説明 | 対応バージョン |
---|---|---|---|
first |
BidirectionalIterator |
このサブマッチがマッチに参加している場合、当該サブマッチの開始位置を表す | C++11 |
second |
BidirectionalIterator |
このサブマッチがマッチに参加している場合、当該サブマッチの終了位置の一つ先を表す | C++11 |
matched |
bool |
このサブマッチがマッチに参加しているか否かを表す | C++11 |
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
value_type |
検索対象の文字の型。iterator_traits<BidirectionalIterator>::value_type の別名 |
C++11 |
difference_type |
2 つのイテレータの差を表すための型。iterator_traits<BidirectionalIterator>::difference_type の別名 |
C++11 |
iterator |
検索対象の文字を指すイテレータの型。BidirectionalIterator の別名 |
C++11 |
string_type |
検索対象の文字の型に対応する文字列型。basic_string<value_type> の別名 |
C++11 |
first_type |
メンバ変数 first の型。pair から継承。BidirectionalIterator の別名 |
C++11 |
second_type |
メンバ変数 second の型。pair から継承。BidirectionalIterator の別名 |
C++11 |
非メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
operator== |
等値比較を行う | C++11 |
operator!= |
非等値比較を行う | C++11 |
operator<=> |
三方比較を行う | C++20 |
operator< |
左辺が右辺よりも小さいか判定を行う | C++11 |
operator<= |
左辺が右辺以下か判定を行う | C++11 |
operator> |
左辺が右辺より大きいか判定を行う | C++11 |
operator>= |
左辺が右辺以上か判定を行う | C++11 |
operator<< |
ストリームへの出力を行う | C++11 |
注:非メンバ関数版の swap
は sub_match
用にオーバーロードされていないため、pair
から継承したメンバ関数 swap
は呼び出さずに汎用版の動作となる(一時変数を利用したムーブでオブジェクトの内容を交換する)。従って、こちらはメンバ変数 matched
も交換される。
非メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
csub_match |
sub_match<const char*> の別名 |
C++11 |
wcsub_match |
sub_match<const wchar_t*> の別名 |
C++11 |
ssub_match |
sub_match<string::const_iterator> の別名 |
C++11 |
wssub_match |
sub_match<wstring::const_iterator> の別名 |
C++11 |
例
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
const std::string s(" abc 123 def ");
const std::regex re(R"((?:(\d+)|(\w+))\s+)");
std::smatch m;
if (std::regex_search(s, m, re)) {
for (int i = 0, n = m.size(); i < n; i++) {
std::ssub_match sub = m[i];
if (sub.matched) {
std::cout << i << ":range = [" << (sub.first - std::begin(s)) << ", " << (sub.second - std::begin(s)) << "), "
"length() = " << sub.length() << ", str() = '" << sub.str() << '\'' << std::endl;
} else {
std::cout << i << ":not participate" << std::endl;
}
}
} else {
std::cout << "not match" << std::endl;
}
}
xxxxxxxxxx
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
const std::string s(" abc 123 def ");
const std::regex re(R"((?:(\d+)|(\w+))\s+)");
std::smatch m;
if (std::regex_search(s, m, re)) {
for (int i = 0, n = m.size(); i < n; i++) {
std::ssub_match sub = m[i];
if (sub.matched) {
std::cout << i << ":range = [" << (sub.first - std::begin(s)) << ", " << (sub.second - std::begin(s)) << "), "
"length() = " << sub.length() << ", str() = '" << sub.str() << '\'' << std::endl;
} else {
std::cout << i << ":not participate" << std::endl;
}
}
} else {
std::cout << "not match" << std::endl;
}
}
出力
0:range = [1, 5), length() = 4, str() = 'abc '
1:not participate
2:range = [1, 4), length() = 3, str() = 'abc'
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅, 3.1 ✅, 3.2 ✅, 3.3 ✅, 3.4 ✅, 3.5 ✅, 3.6 ✅
- GCC: 4.9.0 ✅, 4.9.1 ✅, 5.0.0 ✅
- ICC: ??
- Visual C++: ??