文字列

[C++] 正規表現のパターン文字列を変数に代入して使う方法

C++で正規表現のパターン文字列を変数に代入して使用するには、std::regexクラスを用います。

パターン文字列を文字列型変数(例: std::string)に格納し、それをstd::regexオブジェクトの初期化に利用します。

その後、std::regex_matchstd::regex_searchなどの関数で正規表現を適用できます。

パターン文字列を変数に代入する方法

C++では、正規表現を扱うために<regex>ライブラリを使用します。

パターン文字列を変数に代入することで、柔軟に正規表現を操作することが可能です。

以下にその方法を示します。

変数にパターン文字列を代入する

まず、正規表現のパターンを文字列として変数に代入し、その変数を使って正規表現オブジェクトを作成します。

以下はそのサンプルコードです。

#include <iostream>
#include <regex>
#include <string>
int main() {
    // 正規表現のパターンを変数に代入
    std::string pattern = R"(\d{3}-\d{4})"; // 3桁-4桁の数字
    std::regex regexPattern(pattern); // 正規表現オブジェクトを作成
    // テストする文字列
    std::string testString = "電話番号は 123-4567 です。";
    // 正規表現にマッチするか確認
    if (std::regex_search(testString, regexPattern)) {
        std::cout << "マッチしました!" << std::endl;
    } else {
        std::cout << "マッチしませんでした。" << std::endl;
    }
    return 0;
}
マッチしました!

このコードでは、patternという変数に正規表現のパターンを代入し、std::regexを使って正規表現オブジェクトを作成しています。

std::regex_search関数を使用して、指定した文字列がパターンにマッチするかどうかを確認しています。

正規表現の基本操作

正規表現は、文字列のパターンを定義し、文字列の検索や置換を行うための強力なツールです。

C++の<regex>ライブラリを使用することで、正規表現を簡単に扱うことができます。

ここでは、正規表現の基本的な操作について説明します。

正規表現の主要なクラス

クラス名説明
std::regex正規表現パターンを表すクラス
std::smatchマッチした結果を格納するためのクラス
std::cmatchCスタイルの文字列に対するマッチ結果

正規表現の基本的な操作

  1. マッチング: 文字列が正規表現にマッチするかを確認する。
  2. 検索: 文字列内で正規表現にマッチする部分を検索する。
  3. 置換: 正規表現にマッチする部分を別の文字列に置換する。

サンプルコード:基本的なマッチングと検索

以下のサンプルコードでは、正規表現を使って文字列のマッチングと検索を行います。

#include <iostream>
#include <regex>
#include <string>
int main() {
    // 正規表現のパターンを定義
    std::string pattern = R"(\w+)"; // 単語を表すパターン
    std::regex regexPattern(pattern); // 正規表現オブジェクトを作成
    // テストする文字列
    std::string testString = "C++は楽しいプログラミング言語です。";
    // マッチングの確認
    if (std::regex_search(testString, regexPattern)) {
        std::cout << "マッチしました!" << std::endl;
    } else {
        std::cout << "マッチしませんでした。" << std::endl;
    }
    // マッチした単語を表示
    std::smatch matchResult;
    if (std::regex_search(testString, matchResult, regexPattern)) {
        std::cout << "最初の単語: " << matchResult[0] << std::endl;
    }
    return 0;
}
マッチしました!
最初の単語: C

このコードでは、std::regex_searchを使用して文字列内の単語を検索し、最初にマッチした単語を表示しています。

正規表現のパターンR"(\w+)"は、1つ以上の単語文字(アルファベットや数字)にマッチします。

実践例:変数を使った正規表現の活用

変数を使った正規表現の活用は、動的にパターンを変更したり、複数のパターンを使い分けたりする際に非常に便利です。

ここでは、ユーザーからの入力を受け取り、その入力に基づいて正規表現を適用する実践例を示します。

サンプルコード:ユーザー入力による正規表現の適用

以下のサンプルコードでは、ユーザーが入力したメールアドレスの形式が正しいかどうかを確認します。

正規表現のパターンを変数に代入し、ユーザーの入力に対してマッチングを行います。

#include <iostream>
#include <regex>
#include <string>
int main() {
    // メールアドレスの正規表現パターンを変数に代入
    std::string emailPattern = R"((\w+)(\.\w+)*@(\w+)(\.\w+)+)"; // メールアドレスのパターン
    std::regex regexEmail(emailPattern); // 正規表現オブジェクトを作成
    // ユーザーからの入力を受け取る
    std::string userInput;
    std::cout << "メールアドレスを入力してください: ";
    std::getline(std::cin, userInput); // 入力を取得
    // 正規表現にマッチするか確認
    if (std::regex_match(userInput, regexEmail)) {
        std::cout << "有効なメールアドレスです。" << std::endl;
    } else {
        std::cout << "無効なメールアドレスです。" << std::endl;
    }
    return 0;
}
メールアドレスを入力してください: example@example.com
有効なメールアドレスです。

このコードでは、ユーザーが入力したメールアドレスが正しい形式かどうかを確認しています。

正規表現のパターンはemailPatternという変数に代入され、std::regex_matchを使用してマッチングを行います。

ユーザーが入力したメールアドレスが正しい場合は「有効なメールアドレスです。」と表示され、そうでない場合は「無効なメールアドレスです。」と表示されます。

このように、変数を使うことで、正規表現のパターンを柔軟に変更したり、ユーザーの入力に応じた処理を行ったりすることが可能になります。

応用テクニック

正規表現を使ったプログラミングでは、基本的なマッチングや検索だけでなく、さまざまな応用テクニックを活用することで、より複雑な文字列処理が可能になります。

ここでは、いくつかの応用テクニックを紹介します。

1. 複数のパターンを使ったマッチング

複数の正規表現パターンを組み合わせて、より柔軟なマッチングを行うことができます。

以下のサンプルコードでは、電話番号とメールアドレスの両方を検出します。

#include <iostream>
#include <regex>
#include <string>
int main() {
    // 電話番号とメールアドレスの正規表現パターン
    std::string phonePattern = R"(\d{3}-\d{4})"; // 電話番号のパターン
    std::string emailPattern = R"((\w+)(\.\w+)*@(\w+)(\.\w+)+)"; // メールアドレスのパターン
    std::regex regexPhone(phonePattern);
    std::regex regexEmail(emailPattern);
    // テストする文字列
    std::string testString = "連絡先は 123-4567 または example@example.com です。";
    // 電話番号のマッチング
    if (std::regex_search(testString, regexPhone)) {
        std::cout << "電話番号が見つかりました。" << std::endl;
    }
    // メールアドレスのマッチング
    if (std::regex_search(testString, regexEmail)) {
        std::cout << "メールアドレスが見つかりました。" << std::endl;
    }
    return 0;
}
電話番号が見つかりました。
メールアドレスが見つかりました。

2. 置換操作

正規表現を使って、特定のパターンにマッチする部分を別の文字列に置換することも可能です。

以下のサンプルコードでは、電話番号の形式を変更します。

#include <iostream>
#include <regex>
#include <string>
int main() {
    // 電話番号の正規表現パターン
    std::string phonePattern = R"(\d{3}-\d{4})"; // 電話番号のパターン
    std::regex regexPhone(phonePattern);
    // テストする文字列
    std::string testString = "連絡先は 123-4567 です。";
    // 置換操作
    std::string newFormat = "電話番号: $&"; // $&はマッチした部分を表す
    std::string result = std::regex_replace(testString, regexPhone, newFormat);
    std::cout << result << std::endl; // 置換後の文字列を表示
    return 0;
}
連絡先は 電話番号: 123-4567 です。

3. キャプチャグループの利用

正規表現のキャプチャグループを使うことで、マッチした部分を個別に取得することができます。

以下のサンプルコードでは、メールアドレスのユーザー名とドメインを分けて取得します。

#include <iostream>
#include <regex>
#include <string>
int main() {
    // メールアドレスの正規表現パターン
    std::string emailPattern = R"((\w+)@(\w+)(\.\w+)+)"; // メールアドレスのパターン
    std::regex regexEmail(emailPattern);
    // テストする文字列
    std::string testString = "メールアドレスは example@example.com です。";
    std::smatch matchResult;
    if (std::regex_search(testString, matchResult, regexEmail)) {
        std::cout << "ユーザー名: " << matchResult[1] << std::endl; // ユーザー名
        std::cout << "ドメイン: " << matchResult[2] << std::endl; // ドメイン
    }
    return 0;
}
ユーザー名: example
ドメイン: example

これらの応用テクニックを活用することで、正規表現を使った文字列処理の幅が広がります。

複雑なパターンのマッチングや、マッチした部分の操作を行うことで、より効率的なプログラムを作成することが可能です。

まとめ

この記事では、C++における正規表現の基本的な使い方から、変数を利用したパターンの代入、さらには応用テクニックまで幅広く解説しました。

正規表現を活用することで、文字列の検索や置換、マッチングを効率的に行うことができ、プログラムの柔軟性が向上します。

今後は、実際のプロジェクトや日常のプログラミングにおいて、正規表現を積極的に活用し、より洗練されたコードを書くことを目指してみてください。

関連記事

Back to top button