【C#】文字列の包含チェック:ContainsとIndexOfの使い分け(大文字・小文字の区別)

目次

文字列の「包含」チェック

C#で文字列データを扱う際、「ある文章(文字列)の中に、特定のキーワード(部分文字列)が含まれているか」を判定したい場面は非常に多くあります。例えば、エラーログの文字列に “Error” が含まれているか、ユーザー入力に禁止ワードが含まれているか、といったチェックです。

C#では、この包含チェックを簡単に行うために string.Contains メソッドが提供されています。

この記事では、Contains の基本的な使い方と、大文字・小文字を区別せずに検索したい場合の標準的な方法(IndexOf)について解説します。


string.Contains メソッド (大文字・小文字を区別する)

string.Contains メソッドは、対象の文字列に、引数で指定した部分文字列が含まれているかどうかを bool 値(true または false)で返します。

重要な点として、Contains メソッドはデフォルトで大文字と小文字を厳密に区別します。

Contains のコード例

if 文と組み合わせて、キーワードの有無によって処理を分岐させるのが一般的な使い方です。

using System;

public class ContainsBasicExample
{
    public static void Main()
    {
        string logMessage = "Warning: System resource low.";
        string keyword = "Warning";

        // 1. "Warning" が含まれているかチェック (true)
        if (logMessage.Contains(keyword))
        {
            Console.WriteLine($"キーワード '{keyword}' が見つかりました。");
        }
        else
        {
            Console.WriteLine($"キーワード '{keyword}' は見つかりません。");
        }

        // 2. 大文字・小文字を区別するため、"warning" (小文字) は見つからない (false)
        string lowerKeyword = "warning";
        if (logMessage.Contains(lowerKeyword))
        {
            Console.WriteLine($"キーワード '{lowerKeyword}' が見つかりました。");
        }
        else
        {
            Console.WriteLine($"キーワード '{lowerKeyword}' は見つかりません。");
        }
    }
}

出力結果:

キーワード 'Warning' が見つかりました。
キーワード 'warning' は見つかりません。

Contains は、このように単純かつ高速に、大文字・小文字を区別した包含チェックを行う場合に適しています。


応用: 大文字・小文字を区別せずに検索する

もし、大文字・小文字の違い(例: “Warning” と “warning”)を無視して検索したい場合、Contains メソッドは適していません。

このような場合は、string.IndexOf メソッドと StringComparison 列挙型を組み合わせて使用するのが標準的な方法です。

IndexOf メソッドは、部分文字列が見つかった位置(インデックス、0から始まる)をint型で返します。もし見つからなかった場合は -1 を返します。この特性を利用して包含チェックを行います。

IndexOfStringComparison

IndexOf には、検索方法を指定できるオーバーロード(引数が異なる同名メソッド)があります。

string.IndexOf(string value, StringComparison comparisonType)

  • value: 検索したい部分文字列。
  • comparisonType: 比較のルールを指定します。
    • StringComparison.OrdinalIgnoreCaseStringComparison.InvariantCultureIgnoreCase を指定すると、大文字・小文字を無視して検索します。

コード例(大文字・小文字を無視)

IndexOf の結果が -1 でない(>= 0)かどうかで、文字列が含まれているかを判定します。

using System;

public class IndexOfIgnoreCaseExample
{
    public static void Main()
    {
        string documentText = "This document contains REFERENCES to other files.";
        string searchTerm = "references"; // 小文字で検索

        Console.WriteLine($"検索対象: {documentText}");
        Console.WriteLine($"キーワード: {searchTerm}");
        
        // 比較ルール: OrdinalIgnoreCase (序数ベースで大文字・小文字を無視)
        StringComparison comparisonRule = StringComparison.OrdinalIgnoreCase;

        // IndexOf を使用した包含チェック
        // "references" (小文字) で "REFERENCES" (大文字) を検索
        if (documentText.IndexOf(searchTerm, comparisonRule) >= 0)
        {
            Console.WriteLine("結果: 見つかりました (大文字・小文字 無視)。");
        }
        else
        {
            Console.WriteLine("結果: 見つかりませんでした。");
        }
    }
}

出力結果:

検索対象: This document contains REFERENCES to other files.
キーワード: references
結果: 見つかりました (大文字・小文字 無視)。

まとめ

C#で文字列の包含関係を調べる際は、要件に応じて2つの方法を使い分けます。

  • string.Contains(str):
    • 大文字と小文字を区別して、単純に true/false が欲しい場合。
    • 高速で直感的です。
  • str.IndexOf(substr, StringComparison.OrdinalIgnoreCase) >= 0:
    • 大文字と小文字を無視してtrue/false が欲しい場合。
    • Contains よりも柔軟な検索が可能です。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次