C++ 正規表現で文字列検索(部分一致/完全一致)【regex_search/regex_match】

regexヘッダーのstd::regex_search関数/std::regex_match関数を用いることで、正規表現による部分一致/完全一致を判定することができます。

// #include <regex>

/* 部分一致 */
std::regex_search("u32", std::regex("[0-9]"));    // true
/* 完全一致 */
std::regex_match("u32", std::regex("(i|u)\\d+")); // true

第一引数に検索対象の文字列を指定し、第二引数に判定したい正規表現のパターンをstd::regex(文字列)という形で指定します。判定結果はbool型の戻り値として返されます(マッチした場合: true、しなかった場合: false)。

目次

一致した文字列の抽出や出現位置の判定を行いたい場合には、以下のページを参考にしてください。

正規表現による検索文字列の抽出/出現位置の判定|std::match_results

部分一致(std::regex_search)

regex_search関数は、検索先の文字列に正規表現パターンが含まれているかどうかを判定します。一般的な検索用途に利用できます。JavaScriptにおける部分マッチの処理/./.test("ab")に相当します。

// #include <regex>

std::regex_search("abc", std::regex("\\w")); // true
std::regex_search(std::string("123"), std::regex("\\d")); // true

std::regex_search("9", std::regex("\\d\\d"));  // false
std::regex_search("99", std::regex("\\d\\d")); // true

完全一致(std::regex_match)

regex_match関数は、検索先の文字列全体が正規表現パターンに一致するかどうかを判定します。完全なパターンマッチを判定する用途に利用できます。JavaScriptにおける全文一致の処理/^..$/.test("ab")に相当します。

// #include <regex>

std::regex_match("abc", std::regex("\\w+")); // true
std::regex_match("abc", std::regex("."));    // false
std::regex_match("abc", std::regex(".+"));   // true

std::regex_match("Shop 99", std::regex("\\w+ \\d+")); // true

大文字/小文字の区別(std::regex::icase)

大文字と小文字の区別を行わない場合には、std::regexの第二引数にstd::regex::icaseフラグを指定します。

std::regex_match("ABC", std::regex("abc", std::regex::icase)); // true
std::regex_search("ABC", std::regex("a", std::regex::icase));  // true
std::regex_search("IBM", std::regex("[a-c]", std::regex::icase)); // true

icaseはstd::regex_constants::syntax_option_type列挙体型の定数値として定義されています。同等の値はstd::regex_constants::icaseと言う形で取得することもできます。

std::regex_match("a", std::regex("A", std::regex_constants::icase));
std::regex_match(L"a", std::wregex(L"A", std::wregex::icase));

正規表現機能の応用(ヒアドキュメント、イテレータ、部分検索)

R"()"生文字リテラルによるヒアドキュメントを表現することもできます。これによって\"をエスケープ記号無しに記述することが可能となります。

std::regex_match("u32", std::regex(R"(\w\d+)")); // true

イテレータを指定することで、コンテナクラスへの検索も可能となります。

std::vector<char> a = {'a', 'b', 'c'};
std::regex_match(a.begin(), a.end(), std::regex(".+")); // true

イテレータで特定の範囲を指定することで、部分文字列の検索も可能となります。

// "tring"の範囲で検索
std::string s = "CString";
std::regex_match(begin(s) + 2, end(s), std::regex("[a-z]+")); // true

// "CS"の範囲で検索
const char* s = "CString";
std::regex_match(s, s + 2, std::regex("[A-Z]+")); // true

std::basic_regex<T>という形で特定の型の文字列に対応することも可能です。

std::regex_match(std::basic_string<char>("a"), std::basic_regex<char>(".")); // true

// unsigned char, char16_t, char32_t など、実装によっては利用できないものもある
// error: implicit instantiation of undefined template 'std::__1::ctype<unsigned char>'
std::basic_regex<unsigned char>(); // `std::ctype<T>`の特殊化に依存
広告