[C++] 正規表現のパターン文字列を変数に代入して使う方法
C++で正規表現のパターン文字列を変数に代入して使用するには、std::regex
クラスを用います。
パターン文字列を文字列型変数(例: std::string
)に格納し、それをstd::regex
オブジェクトの初期化に利用します。
その後、std::regex_match
やstd::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::cmatch | Cスタイルの文字列に対するマッチ結果 |
正規表現の基本的な操作
- マッチング: 文字列が正規表現にマッチするかを確認する。
- 検索: 文字列内で正規表現にマッチする部分を検索する。
- 置換: 正規表現にマッチする部分を別の文字列に置換する。
サンプルコード:基本的なマッチングと検索
以下のサンプルコードでは、正規表現を使って文字列のマッチングと検索を行います。
#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++における正規表現の基本的な使い方から、変数を利用したパターンの代入、さらには応用テクニックまで幅広く解説しました。
正規表現を活用することで、文字列の検索や置換、マッチングを効率的に行うことができ、プログラムの柔軟性が向上します。
今後は、実際のプロジェクトや日常のプログラミングにおいて、正規表現を積極的に活用し、より洗練されたコードを書くことを目指してみてください。