文字列

[C++] stringを部分一致で比較する方法 – find/containsメソッド

C++で文字列を部分一致で比較するには、std::stringクラスのfindメソッドやC++20以降で追加されたcontainsメソッドを使用します。

findは検索対象の文字列が見つかった場合、その開始位置を返し、見つからない場合はstd::string::nposを返します。

一方、containsは検索対象が含まれているかをbool値で返します。

containsはC++20以降で利用可能なため、古いバージョンではfindを使用する必要があります。

部分一致の基本

C++における部分一致の比較は、文字列の中に特定の部分が含まれているかどうかを確認するための重要な操作です。

これにより、ユーザーの入力やデータの検証を行う際に、柔軟な条件を設定することが可能になります。

C++では、主にstd::stringクラスのfindメソッドや、C++20から追加されたcontainsメソッドを使用して部分一致を実現します。

部分一致の重要性

  • ユーザー入力の検証
  • データベース検索の効率化
  • テキスト処理の柔軟性向上

部分一致を利用することで、特定の条件に基づいた処理を行うことができ、プログラムの機能を大幅に向上させることができます。

次のセクションでは、std::stringfindメソッドについて詳しく見ていきます。

std::stringのfindメソッド

std::stringクラスのfindメソッドは、指定した文字列が対象の文字列内に存在するかどうかを確認するためのメソッドです。

このメソッドは、部分一致を確認する際に非常に便利です。

findメソッドは、見つかった位置を返し、見つからなかった場合はstd::string::nposを返します。

findメソッドの基本的な使い方

以下は、findメソッドを使用したサンプルコードです。

#include <iostream>
#include <string>
int main() {
    std::string text = "こんにちは、世界!";
    std::string searchString = "世界";
    // 部分一致を確認
    size_t position = text.find(searchString);
    if (position != std::string::npos) {
        std::cout << "部分一致が見つかりました。位置: " << position << std::endl;
    } else {
        std::cout << "部分一致は見つかりませんでした。" << std::endl;
    }
}
部分一致が見つかりました。位置: 7

findメソッドの引数

findメソッドは、以下の引数を取ります。

引数名説明
searchString検索する文字列
position検索を開始する位置(オプション)

このメソッドを使用することで、特定の文字列がどこに存在するかを簡単に確認することができます。

次のセクションでは、C++20から追加されたcontainsメソッドについて説明します。

C++20のcontainsメソッド

C++20では、std::stringクラスに新たにcontainsメソッドが追加されました。

このメソッドは、指定した文字列が対象の文字列に含まれているかどうかを簡潔に確認するためのものです。

containsメソッドは、部分一致の確認をより直感的に行えるように設計されています。

containsメソッドの基本的な使い方

以下は、containsメソッドを使用したサンプルコードです。

#include <iostream>
#include <string>
int main() {
    std::string text = "こんにちは、世界!";
    std::string searchString = "世界";
    // 部分一致を確認
    if (text.contains(searchString)) {
        std::cout << "部分一致が見つかりました。" << std::endl;
    } else {
        std::cout << "部分一致は見つかりませんでした。" << std::endl;
    }
}
部分一致が見つかりました。

containsメソッドの特徴

  • シンプルな構文: containsメソッドは、部分一致の確認を非常にシンプルに行えます。
  • 戻り値: trueまたはfalseを返し、部分一致の有無を明確に示します。

このメソッドを使用することで、コードがより読みやすくなり、部分一致の確認が簡単に行えるようになります。

次のセクションでは、findメソッドとcontainsメソッドの使い分けについて説明します。

findとcontainsの使い分け

std::stringfindメソッドとC++20のcontainsメソッドは、どちらも部分一致を確認するために使用されますが、それぞれの特性や用途に応じて使い分けることが重要です。

以下に、両者の違いと使い分けのポイントを示します。

findメソッドの特徴

  • 位置の取得: findメソッドは、部分一致が見つかった場合、その位置を返します。

これにより、文字列内での具体的な位置を知ることができます。

  • 柔軟性: 検索を開始する位置を指定できるため、特定の範囲内での検索が可能です。

containsメソッドの特徴

  • シンプルな構文: containsメソッドは、部分一致の有無を確認するためのシンプルな構文を提供します。

結果はtrueまたはfalseで返されるため、条件分岐が簡単です。

  • 可読性: コードが直感的で読みやすく、部分一致の確認が明確に表現されます。

使い分けのポイント

使用シーン推奨メソッド
部分一致の位置を知りたい場合find
単に部分一致の有無を確認したい場合contains
検索を開始する位置を指定したい場合find
コードの可読性を重視したい場合contains

このように、findメソッドとcontainsメソッドは、それぞれ異なる目的に応じて使い分けることができます。

次のセクションでは、応用的な部分一致の実現方法について説明します。

応用的な部分一致の実現方法

部分一致の確認は、基本的な機能だけでなく、さまざまな応用が可能です。

ここでは、findメソッドやcontainsメソッドを使った応用的な部分一致の実現方法をいくつか紹介します。

1. 大文字小文字を無視した部分一致

大文字小文字を無視して部分一致を確認するためには、文字列をすべて小文字または大文字に変換してから比較する方法があります。

以下はそのサンプルコードです。

#include <iostream>
#include <string>
#include <algorithm> // std::transform
int main() {
    std::string text = "こんにちは、世界!";
    std::string searchString = "世界";
    // 文字列を小文字に変換
    std::string lowerText = text;
    std::string lowerSearchString = searchString;
    std::transform(lowerText.begin(), lowerText.end(), lowerText.begin(), ::tolower);
    std::transform(lowerSearchString.begin(), lowerSearchString.end(), lowerSearchString.begin(), ::tolower);
    // 部分一致を確認
    if (lowerText.find(lowerSearchString) != std::string::npos) {
        std::cout << "部分一致が見つかりました。" << std::endl;
    } else {
        std::cout << "部分一致は見つかりませんでした。" << std::endl;
    }
}
部分一致が見つかりました。

2. 正規表現を使用した部分一致

C++11以降、<regex>ライブラリを使用することで、正規表現を用いた部分一致の確認が可能です。

以下はそのサンプルコードです。

#include <iostream>
#include <string>
#include <regex> // std::regex
int main() {
    std::string text = "こんにちは、世界!";
    std::string pattern = "世.*";
    // 正規表現を使用して部分一致を確認
    std::regex regexPattern(pattern);
    if (std::regex_search(text, regexPattern)) {
        std::cout << "部分一致が見つかりました。" << std::endl;
    } else {
        std::cout << "部分一致は見つかりませんでした。" << std::endl;
    }
}
部分一致が見つかりました。

3. 複数の部分一致を確認する

複数の文字列が含まれているかどうかを確認する場合、ループを使用して各文字列をチェックすることができます。

以下はそのサンプルコードです。

#include <iostream>
#include <string>
#include <vector>
int main() {
    std::string text = "こんにちは、世界!";
    std::vector<std::string> searchStrings = {"世界", "こんにちは", "さようなら"};
    // 複数の部分一致を確認
    for (const auto& searchString : searchStrings) {
        if (text.find(searchString) != std::string::npos) {
            std::cout << searchString << " が見つかりました。" << std::endl;
        } else {
            std::cout << searchString << " は見つかりませんでした。" << std::endl;
        }
    }
}
世界 が見つかりました。
こんにちは が見つかりました。
さようなら は見つかりませんでした。

これらの応用方法を活用することで、部分一致の確認をより柔軟に行うことができます。

まとめ

この記事では、C++における文字列の部分一致を確認するためのstd::stringfindメソッドとC++20から追加されたcontainsメソッドについて詳しく解説しました。

また、応用的な部分一致の実現方法として、大文字小文字を無視した比較や正規表現を用いた検索、複数の部分一致の確認方法も紹介しました。

これらの知識を活用することで、文字列処理の幅を広げ、より効率的なプログラムを作成することが可能になります。

ぜひ、実際のプロジェクトや学習において、これらのメソッドを試してみてください。

関連記事

Back to top button