正規表現-検索:regex_search、regex_iterator
対象となる文字列から正規表現と一致する部分を見つけます。
regex_searchの引数はregex_matchと同じです。regex_matchは与えた正規表現が文字列に完全マッチするかを調べるのに対し、regex_searchは正規表現が最初にマッチする範囲(位置と長さ)を探します。
/* #include は省略 */ using namespace std; int main() { string source = "c++ postscript visualbasic javascript java ecmascript"; tr1::regex re("([^ ]+)script"); tr1::smatch results; if ( tr1::regex_search(source, results, re) ) { for ( size_t i = 0; i < results.size(); ++i ) { cout << i << ':' << results.position(i) << ',' << results.length(i) << ':' << results.str(i) << endl; } } }
0:4,10:postscript 1:4,4:post
regex_searchは文字列中の最初にマッチする部分を見つけますが、文字列からマッチ部分をすべて列挙したいならregex_iteratorが便利です。
/* #include は省略 */ using namespace std; int main() { // "なんたらscript"を列挙する string source = "c++ postscript visualbasic javascript java ecmascript"; tr1::regex re("([^ ]+)script"); tr1::sregex_iterator iter( source.begin(), source.end(), re); tr1::sregex_iterator last; while ( iter != last ) { for ( size_t i = 0; i < iter->size(); ++i ) { cout << i << ':' << iter->position(i) << ',' << iter->length(i) << ':' << iter->str(i) << ' '; } cout << endl; ++iter; } }
0:4,10:postscript 1:4,4:post 0:27,10:javascript 1:27,4:java 0:43,10:ecmascript 1:43,4:ecma
/* #include は省略 */ using namespace std; int main() { wcout.imbue(locale("japanese")); wstring source = L"うしかもしか"; tr1::wregex re(L"うし|しか|かも|かもしか"); tr1::wsregex_iterator iter( source.begin(), source.end(), re); tr1::wsregex_iterator last; while ( iter != last ) { for ( size_t i = 0; i < iter->size(); ++i ) { wcout << i << L':' << iter->position(i) << L',' << iter->length(i) << L':' << iter->str(i) << ' '; } wcout << endl; ++iter; } }
0:0,2:うし 0:2,2:かも 0:4,2:しか
