文字列の「包含」チェック
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 を返します。この特性を利用して包含チェックを行います。
IndexOf と StringComparison
IndexOf には、検索方法を指定できるオーバーロード(引数が異なる同名メソッド)があります。
string.IndexOf(string value, StringComparison comparisonType)
value: 検索したい部分文字列。comparisonType: 比較のルールを指定します。StringComparison.OrdinalIgnoreCaseやStringComparison.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よりも柔軟な検索が可能です。
- 大文字と小文字を無視して、
