(C++ 上級) 正規表現

目次

1.コンセプト

1 はじめに

2. キャラクタールール

2. よく使う機能

1、std::regex_match

2、std::regex_search

3、std::regex_replace

3、std::smatch


1.コンセプト

1 はじめに

正規表現 (通常は RegExp または Regex と略されます) は、文字列パターンを照合するための強力なツールです。 。これは、一致パターンを定義するために使用される一連の文字と特殊記号で構成されます。正規表現はテキスト処理、データ検証、検索と置換などの分野で広く使用されています。

2. キャラクタールール

C++11 では正規表現のサポートが導入され、正規表現パターンを使用して文字列を操作および処理できるようになりました。

1. 基本的な文字の一致:
    `\d`: `[0-9]` と同等の任意の数字に一致します。
    `\D`: `[^0-9]` と同等の数値以外の文字に一致します。
    `\w`: 任意の文字、数字、またはアンダースコア文字と一致します。
    `\W`: 文字、数字、アンダースコア以外の文字と一致します。
    `\s`: スペース、タブ、改行などを含む任意の空白文字と一致します。
    `\S`: 空白以外の任意の文字と一致します。

2. カスタム文字セット:
    `[...]`: 角括弧で囲まれた文字セット。いずれかの文字と一致します。たとえば、「[aeiou]」は任意の母音に一致します。

3. 数量子:
    `*`: 前の要素と 0 回以上一致します。
    `+`: 前の要素と 1 回以上一致します。
    `?`: 前の要素と 0 回または 1 回一致します。
    `{n}`: 前の要素と正確に n 回一致します。
    `{n,}`: 前の要素と少なくとも n 回一致します。
    `{n,m}`: 前の要素を n ~ m 回照合します。

4. 位置アンカー:
    `^`: 文字列の先頭と一致します。
    `$`: 文字列の末尾と一致します。
    `\b`: 単語の境界を一致させます。

5. グループ化とキャプチャ:
    `(...)`: 括弧を使用してキャプチャ グループを作成し、一致するコンテンツを抽出します。

6. エスケープ文字:
    `\`: 文字自体に一致する特別な意味を持つ文字をエスケープするために使用されます。たとえば、「\.」はピリオド文字「.」と一致します。

7. | 演算子:
    `|`: 複数の選択項目の 1 つと一致する論理 OR 演算を作成するために使用されます。たとえば、「cat|dog」は「cat」または「dog」に一致します。

8. フラグ:
    正規表現には、大文字と小文字を区別しない照合用の `std::regex::icase` などのいくつかのフラグを付けることができます。

2. よく使う機能

1、std::regex_match

`std::regex_match` は、完全一致を実行するために使用される C++ 標準ライブラリの正規表現関数です。 文字列が指定された正規表現パターンに正確に一致するかどうかを判断するために使用されます。

`std::regex_match` の構文と例は次のとおりです。

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string text = "42";
    std::regex pattern(R"(\d+)");

    if (std::regex_match(text, pattern)) {
        std::cout << "Valid integer." << std::endl;
    } else {
        std::cout << "Not a valid integer." << std::endl;
    }

    return 0;
}

正規表現パターン `pattern` を定義する文字列 `text` があり、これは 1 つ以上の数値と一致するために使用されます。 `std::regex_match` 関数を使用して、`text` と `pattern` を比較し、完全に一致するかどうかを判断します。

文字列 `text` が正規表現パターン `pattern` に正確に一致する場合、条件は true になります。

`std::regex_match` は文字列全体で一致するもののみを検索し、文字列全体がパターンに一致する場合は `true` を返し、それ以外の場合は `false` を返します。

これは、文字列が指定されたパターンに正確に準拠していることを検証する方法であり、データ検証や入力チェックに最適です。

`std::regex_search` は、文字列内で一致する正規表現パターンを検索するために使用される C++ 標準ライブラリの関数です。 `std::regex_match` とは異なり、`std::regex_search` は文字列内の部分一致を見つけるために使用されます文字列全体の完全一致を必要とする代わりに。

`std::regex_search` の構文と例は次のとおりです。

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string text = "Contact us at [email protected] or [email protected] for assistance.";
    std::regex pattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b)");
    std::smatch matches;

    while (std::regex_search(text, matches, pattern)) {
        std::cout << "Found email: " << matches[0] << std::endl;
        text = matches.suffix();
    }

    return 0;
}

複数の電子メール アドレスを含む文字列 `text` と、電子メール アドレスの一致に使用される正規表現パターン `pattern`。

`std::regex_search` 関数を使用して、パターン `pattern` に一致するコンテンツの `text` を検索します。一致するものが見つかると、`std::regex_search` は `true` を返し、一致したコンテンツを `std::smatch` オブジェクトの `matches` に保存します。

ループ内で、見つかった各電子メール アドレスを出力し、「matches.suffix()」を使用して文字列の位置を移動し、次の反復で次の一致が見つかるようにします。

`std::regex_search` は通常、単に一致が存在することを確認するのではなく、複数の一致を含む文字列を検索するために使用されます。これは、テキスト分析、データ抽出、検索エンジンなどのアプリケーションに役立ちます。

3、std::regex_replace

`std::regex_replace` は、正規表現パターンに一致する文字列の一部を置換するために使用される C++ 標準ライブラリの関数です。一致するテキストを指定したコンテンツに置き換えることができます。

以下に `std::regex_replace` の例と手順を示します。

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string text = "The color of the sky is blue, and the ocean is also blue.";
    std::regex pattern("blue");
    std::string replacement = "green";

    std::string result = std::regex_replace(text, pattern, replacement);
    std::cout << "Replaced text: " << result << std::endl;

    return 0;
}

文字列「text」と、単語「blue」に一致する正規表現パターン「pattern」を定義します。 「青」に一致するものをすべて「緑」に置き換えます。

`std::regex_replace` 関数を使用して、パターン `pattern` に一致する `text` の部分を指定された `replacement` で置き換え、結果を `result` 変数に保存します。 「青」は「緑」に置き換えられます。

`std::regex_replace` は、特にテキスト処理において置換操作を実行するのに非常に便利です。必要に応じて、さまざまな正規表現パターンと置換コンテンツを作成して、さまざまなテキスト置換のニーズを実現できます。

3、std::smatch

`std::smatch` は C++ 標準ライブラリのクラスで、正規表現の一致結果を保存するために使用されます。 通常、正規表現内の一致する部分文字列を取得、保存、アクセスするために使用されます。

`std::smatch` の例と手順は次のとおりです。

#include <iostream>
#include <regex>
#include <string>

int main() {
    std::string text = "My phone number is (123) 456-7890.";
    std::regex pattern(R"(\(\d{3}\) \d{3}-\d{4})");
    std::smatch matches;

    if (std::regex_search(text, matches, pattern)) {
        std::cout << "Match found: " << matches[0] << std::endl;
        std::cout << "Capture group 1: " << matches[1] << std::endl;
    } else {
        std::cout << "No match found." << std::endl;
    }

    return 0;
}

正規表現パターンの一致結果を保存するには、`std::smatch` を使用します。正規表現パターン `(\(\d{3}\) \d{3}-\d{4})` は電話番号の一致に使用され、かっこ `()` はキャプチャするためのキャプチャ グループの作成に使用されます。電話番号のさまざまな部分。

`std::regex_search` の呼び出しでは、一致する結果を保存するために `matches` が使用されます。一致が成功すると、`matches[0]` には一致した文字列全体が含まれ、`matches[1]` にはキャプチャ グループ 1 の内容 (電話番号部分) が含まれます。

`std::smatch` を使用すると、複数の一致結果を保存できます。正規表現に複数のキャプチャ グループがある場合、各グループの内容には `matches` 配列を通じてアクセスできます。これにより、テキスト データを操作する場合に、一致する部分の抽出と操作が容易になります。

`std::smatch` クラスは、C++ で正規表現を処理するための便利なツールであり、テキストから特定のパターン情報を抽出して処理するのに特に適しています。

Guess you like

Origin blog.csdn.net/qq_57594025/article/details/134005713