regexの基礎
テキスト内のパターンにマッチさせます
「regexの基礎」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
<regex>とは?
<regex>ヘッダーを使うと、文字列の集合を表す正規表現パターンに対してテキストを照合できます。パターンを作成し、それを使ってテキストを検査または検索します。
std::regexはコンパイル済みのパターンを保持します。- マッチング関数は、テキストがパターンに適合するかどうかを報告します。
#include <iostream>
#include <regex>
int main() {
std::regex pattern("hello");
std::cout << std::boolalpha << std::regex_match("hello", pattern) << '\n';
return 0;
}regex_matchとregex_searchの違い
regex_matchでは、文字列全体が一致する必要があります。regex_searchは、文字列のどこかにパターンが現れれば成功します。
#include <iostream>
#include <regex>
int main() {
std::regex p("cat");
std::string s = "the cat sat";
std::cout << std::boolalpha;
std::cout << "match: " << std::regex_match(s, p) << '\n';
std::cout << "search: " << std::regex_search(s, p) << '\n';
return 0;
}文字クラス
角括弧は、使用可能な文字の集合を定義します。[aeiou]は任意の1つの母音に一致し、[a-z]のような範囲は小文字に一致します。
#include <iostream>
#include <regex>
int main() {
std::regex p("[a-z]+");
std::cout << std::boolalpha << std::regex_match("hello", p) << '\n';
std::cout << std::regex_match("Hello", p) << '\n';
return 0;
}量指定子
量指定子は繰り返しを制御します。*は0回以上、+は1回以上、?は省略可能、{n,m}は個数の範囲を表します。
#include <iostream>
#include <regex>
int main() {
std::regex p("a+b");
std::cout << std::boolalpha;
std::cout << std::regex_match("aaab", p) << '\n';
std::cout << std::regex_match("b", p) << '\n';
return 0;
}定義済みクラス
短縮クラスを使うと入力を省略できます。\\dは数字、\\wは単語文字、\\sは空白文字に一致します。C++のソースでは、バックスラッシュを2つ重ねて記述します。
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d+");
std::cout << std::boolalpha;
std::cout << std::regex_match("12345", p) << '\n';
std::cout << std::regex_match("12a45", p) << '\n';
return 0;
}アンカー
アンカーはマッチする位置を固定します。^はテキストの先頭、$は末尾を表します。アンカーが一致するのは文字ではなく位置です。
#include <iostream>
#include <regex>
int main() {
std::regex p("^abc$");
std::cout << std::boolalpha;
std::cout << std::regex_search("abc", p) << '\n';
std::cout << std::regex_search("xabc", p) << '\n';
return 0;
}選択
パイプ|は「または」を意味します。パターンcat|dogはどちらか一方の単語に一致します。範囲を限定するには、括弧でグループ化します。
#include <iostream>
#include <regex>
int main() {
std::regex p("cat|dog");
std::cout << std::boolalpha;
std::cout << std::regex_match("cat", p) << '\n';
std::cout << std::regex_match("dog", p) << '\n';
std::cout << std::regex_match("fish", p) << '\n';
return 0;
}特殊文字のエスケープ
.、*、(などの文字には特殊な意味があります。文字どおりに一致させるには、バックスラッシュでエスケープします。
#include <iostream>
#include <regex>
int main() {
std::regex p("3\\.14");
std::cout << std::boolalpha;
std::cout << std::regex_match("3.14", p) << '\n';
std::cout << std::regex_match("3x14", p) << '\n';
return 0;
}大文字と小文字を区別しないマッチング
パターンを構築するときにstd::regex::icaseなどのフラグを渡すと、マッチング時に大文字と小文字を区別しなくなります。
#include <iostream>
#include <regex>
int main() {
std::regex p("hello", std::regex::icase);
std::cout << std::boolalpha;
std::cout << std::regex_match("HELLO", p) << '\n';
std::cout << std::regex_match("Hello", p) << '\n';
return 0;
}簡単な検証
パターンは、符号を省略できる基本的な数値のように、入力形式を検証するのに適しています。
#include <iostream>
#include <regex>
bool isNumber(const std::string& s) {
static const std::regex p("-?\\d+");
return std::regex_match(s, p);
}
int main() {
std::cout << std::boolalpha;
std::cout << isNumber("-42") << '\n';
std::cout << isNumber("4a2") << '\n';
return 0;
}複数回のマッチング
文字クラスと量指定子を組み合わせると、文字列の後に数字が続く形式など、より複雑な形式を検証できます。
#include <iostream>
#include <regex>
int main() {
std::regex p("[A-Za-z]+\\d+");
std::cout << std::boolalpha;
std::cout << std::regex_match("abc123", p) << '\n';
std::cout << std::regex_match("123abc", p) << '\n';
return 0;
}クイックチェック
マッチと検索の違いについて理解度を確認します。
まとめ
<regex>の基本を学びました。
- 文字列全体には
regex_match、部分文字列にはregex_searchを使う - 文字クラス、量指定子、アンカー、選択
\\dなどの定義済みクラスと特殊文字のエスケープicaseなどのフラグ
次は、キャプチャグループを使ってマッチした部分を取り出します。
よくある質問
「regexの基礎」レッスンは無料ですか?
はい。「regexの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「regexの基礎」で何を学びますか?
テキスト内のパターンにマッチさせます ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「regexの基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- regexの基礎
- キャプチャグループ
- 検索と置換
- パフォーマンスに関する注意点