ホームページ  >  記事  >  バックエンド開発  >  C++ での正規表現を使用したテキストの解析

C++ での正規表現を使用したテキストの解析

PHPz
PHPzオリジナル
2023-08-22 14:58:43948ブラウズ

C++ での正規表現を使用したテキストの解析

C での正規表現を使用したテキストの解析

正規表現は、テキスト パターンの照合と検索を行うための強力かつ柔軟なツールです。 C では、正規表現ライブラリを使用してテキストを解析できます。

C の正規表現ライブラリには、std::regex と Boost.Regex という 2 つの主な選択肢があります。どちらのライブラリも同様のインターフェイスと機能を提供します。ただし、実装方法が異なるため、場合によってはパフォーマンスに違いが生じる可能性があります。一般に、Boost.Regex はより高速で正確なオプションであると考えられていますが、Boost ライブラリの使用も必要です。

この記事では、std::regex ライブラリを使用して C でテキストを解析する方法を紹介します。さまざまな正規表現構文を使用してテキストを照合および抽出する方法をいくつかの例を通して示します。

例 1: 基本テキストの一致

この例では、「hello」を含む文字列と一致します。

#include <iostream>
#include <regex>
 
int main() {
    std::string text = "hello world!";
    std::regex pattern("hello");
 
    if (std::regex_search(text, pattern)) {
        std::cout << "Match found!" << std::endl;
    } else {
        std::cout << "Match not found." << std::endl;
    }
 
    return 0;
}

この単純なプログラムは、std::regex_search() 関数を使用して、テキスト内に「hello」文字列が存在するかどうかを検索します。一致が見つかった場合、プログラムは「一致が見つかりました!」を出力し、そうでない場合は「一致が見つかりません」を出力します。 std::string クラスと std::regex クラスを使用し、正規表現を文字列として regex オブジェクトに渡したことに注意してください。

例 2: メタキャラクターの使用

正規表現内のメタキャラクターは、特別な意味を持つ文字を指します。最も一般的に使用されるメタ文字とその意味の一部を次に示します:

  • . 任意の文字と一致します。
  • #^ 文字列の先頭と一致します。
  • $ 文字列の末尾と一致します。
  • d は数値と一致します。
  • w 単語文字 (文字、数字、またはアンダースコア) と一致します。
  • s は空白文字 (スペース、タブなど) に一致します。
以下の例では、「hello」で始まる任意の文字列と一致します。

#include <iostream>
#include <regex>
 
int main() {
    std::string text1 = "hello world!";
    std::string text2 = "world hello!";
    std::regex pattern("^hello");
 
    if (std::regex_search(text1, pattern)) {
        std::cout << "Match found in text1!" << std::endl;
    }
 
    if (std::regex_search(text2, pattern)) {
        std::cout << "Match found in text2!" << std::endl;
    }
 
    return 0;
}

この例では、メタキャラクター「^」を使用して、「hello」で始まる文字列と一致させます。最初のテキスト「hello world!」では、正規表現も文字列も「hello」で始まるため、プログラムは「text1 で一致が見つかりました!」と出力します。 2 番目のテキスト「world hello!」では、正規表現が文字列の先頭と一致しないため、プログラムは何も出力しません。

例 3: 量指定子の使用

正規表現内の量指定子は、パターン一致の数を指定します。以下に、最も一般的に使用される量指定子とその意味をいくつか示します。

    • 前述のパターンと 0 回以上一致します。
    • # 前のパターンと 1 回以上一致します。
  • ? 前述のパターンと 0 回または 1 回一致します。
  • {n} 前のパターンと正確に n 回一致します。
  • {n,} 前のパターンと少なくとも n 回一致します。
  • {n,m} は、前のパターンと少なくとも n 回一致しますが、m 回を超えません。
次の例では、量指定子 " " を使用して 1 つ以上の数値と一致させます。

#include <iostream>
#include <regex>
 
int main() {
    std::string text1 = "1234";
    std::string text2 = "a1234";
    std::regex pattern("\d+");
 
    if (std::regex_search(text1, pattern)) {
        std::cout << "Match found in text1!" << std::endl;
    }
 
    if (std::regex_search(text2, pattern)) {
        std::cout << "Match found in text2!" << std::endl;
    }
 
    return 0;
}

この例では、正規表現「d」を使用して 1 つ以上の数値と一致します。最初のテキスト「1234」では、正規表現は文字列全体と一致するため、プログラムは「text1 で一致が見つかりました!」と出力します。 2 番目のテキスト「a1234」では、正規表現は数値部分文字列「1234」にのみ一致するため、プログラムは「text2 で一致が見つかりました!」と出力します。

例 4: グループ化の使用

正規表現でグループ化を使用すると、パターンをサブパターンに分割し、一致するときにそのうちの 1 つだけを考慮することができます。グループ化は括弧を使用して表現されます。以下の例では、「hello」または「world」を含む文字列と一致します。

#include <iostream>
#include <regex>
 
int main() {
    std::string text1 = "hello";
    std::string text2 = "world";
    std::string text3 = "hello world!";
    std::regex pattern("(hello|world)");
 
    if (std::regex_search(text1, pattern)) {
        std::cout << "Match found in text1!" << std::endl;
    }
 
    if (std::regex_search(text2, pattern)) {
        std::cout << "Match found in text2!" << std::endl;
    }
 
    if (std::regex_search(text3, pattern)) {
        std::cout << "Match found in text3!" << std::endl;
    }
 
    return 0;
}

この例では、正規表現「(hello|world)」を使用して、「hello」と「world」を 2 つのグループとしてグループ化します。最初のテキスト「hello」では、正規表現は最初のグループにのみ一致するため、プログラムは「text1 で一致が見つかりました!」と出力します。 2 番目のテキスト「world」では、正規表現は 2 番目のグループにのみ一致するため、プログラムは「text2 で一致が見つかりました!」と出力します。 3 番目のテキスト「hello world!」では、正規表現が最初または 2 番目のグループに一致するため、プログラムは「text3 で一致が見つかりました!」と出力します。

概要

この記事では、正規表現を使用して C でテキストを解析する方法を紹介しました。メタキャラクター、量指定子、グループ化など、最も一般的に使用される正規表現構文の一部について詳しく説明します。これらの例が、正規表現を使用してテキスト データを処理する方法をより深く理解するのに役立つことを願っています。

以上がC++ での正規表現を使用したテキストの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。