C++の基礎 - 正規表現

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2024年10月24日 (木) 00:32時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == C++において、正規表現はテキストパターンのマッチング、検索、置換等を行うための強力なツールである。<br> C++ 11以降では、標準ライブラリとして<regex>ヘッダが導入されており、正規表現の機能が言語に組み込まれた。<br> <br> これにより、外部ライブラリに頼ることなく正規表現を扱うことができる。<br> <br> 基本的な使用方法としては…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

C++において、正規表現はテキストパターンのマッチング、検索、置換等を行うための強力なツールである。
C++ 11以降では、標準ライブラリとして<regex>ヘッダが導入されており、正規表現の機能が言語に組み込まれた。

これにより、外部ライブラリに頼ることなく正規表現を扱うことができる。

基本的な使用方法としては、std::regexクラスでパターンを定義して、std::regex_matchstd::regex_search等のメソッドを使用してマッチングを行う。
マッチした結果は、std::smatchクラスで取得できる。

正規表現の構文は、基本的に他の言語やツールで使用されているものと似ているが、いくつか特徴がある。
例えば、文字列リテラルで使用する場合はバックスラッシュを二重に記述する必要がある。
これは、C++の文字列エスケープシーケンスの仕様によるものである。

パターンマッチングのスタイルは複数用意されており、ECMAScriptスタイル (デフォルト)、basic、extended、awk等から選択できる。
最も一般的に使用されるのはECMAScriptスタイルであり、JavaScriptの正規表現と互換性がある。

また、正規表現操作にはいくつかのフラグを設定することができる。
大文字小文字を区別しない検索、複数行モード、より効率的なマッチングのための最適化等を指定できる。

エラーハンドリングも重要な要素である。
不正な正規表現パターンを指定した場合、std::regex_errorという例外が投げられるため、try-catchブロックでの適切な例外処理が推奨される。

C++の正規表現は他の言語と比べて実行速度が遅いことがある。
パフォーマンスが重要な場合は、Boostライブラリの正規表現機能や他の文字列処理手法の使用を検討する。


正規表現の使用例 : メールアドレス

以下の例では、ユーザ名、@記号、ドメイン部分を適切にパターンマッチングしている。

 #include <iostream>
 #include <regex>
 #include <string>
 
 void emailValidation()
 {
    try {
       std::string email = "user@example.com";
       std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})");
 
       if (std::regex_match(email, pattern)) {
          std::cout << "Valid email address\n";
       }
    }
    catch (const std::regex_error &e) {
       std::cerr << "Regex error: " << e.what() << "\nCode: " << e.code() << '\n';
    }
    catch (const std::exception &e) {
       std::cerr << "Error: " << e.what() << '\n';
    }
 }
 
 int main()
 {
    try {
       emailValidation();
    }
    catch (const std::exception &e) {
       std::cerr << "Main function error: " << e.what() << '\n';
       return -1;
    }
 
    return 0;
 }