0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. regexの基礎
  2. キャプチャグループ
  3. 検索と置換
  4. パフォーマンスに関する注意点
← C++ Academyに戻る