[C#] String.Containsメソッドの使い方 – 文字列を検索する
C#のString.Containsメソッド
は、指定した文字列が元の文字列に含まれているかどうかを確認するために使用されます。
戻り値はbool型
で、含まれていればtrue
、含まれていなければfalse
を返します。
大文字と小文字は区別されます。
使用例として、"Hello World".Contains("World")
はtrue
を返します。
部分文字列が見つからない場合や、空の文字列を検索した場合はfalse
が返されます。
- String.Containsメソッドの基本的な使い方
- 大文字・小文字の区別についての注意点
- 複数の文字列を同時に検索する方法
- 正規表現との違いと使い分け
- パフォーマンス向上のための工夫
String.Containsメソッドとは
String.Containsメソッド
は、指定した文字列が他の文字列に含まれているかどうかを判断するためのメソッドです。
このメソッドは、文字列が部分的に一致するかを確認する際に非常に便利です。
シグネチャは以下の通りです。
public bool Contains(string value);
このメソッドは、引数として検索したい文字列value
を受け取り、戻り値としてbool型
を返します。
true
が返される場合は、指定した文字列が含まれていることを示し、false
の場合は含まれていないことを示します。
大文字・小文字の区別については、String.Containsメソッド
はデフォルトで区別を行います。
つまり、”Hello”と”hello”は異なる文字列として扱われます。
この特性を理解しておくことは、文字列検索を行う際に重要です。
String.Containsメソッドの基本的な使い方
文字列が含まれているかを確認する
String.Containsメソッド
を使用して、特定の文字列が他の文字列に含まれているかを確認する基本的な例を示します。
以下のコードでは、”こんにちは”という文字列に”にち”が含まれているかをチェックしています。
using System;
class Program
{
static void Main()
{
string text = "こんにちは、世界!";
string searchString = "にち";
bool contains = text.Contains(searchString); // 文字列が含まれているか確認
Console.WriteLine(contains); // 結果を表示
}
}
True
部分文字列が見つからない場合の挙動
部分文字列が見つからない場合、String.Containsメソッド
はfalse
を返します。
以下の例では、”こんにちは”に”さようなら”が含まれているかを確認しています。
using System;
class Program
{
static void Main()
{
string text = "こんにちは、世界!";
string searchString = "さようなら";
bool contains = text.Contains(searchString); // 文字列が含まれているか確認
Console.WriteLine(contains); // 結果を表示
}
}
False
空文字列を検索した場合の挙動
空文字列を検索した場合、String.Containsメソッド
は常にtrue
を返します。
これは、任意の文字列には空文字列が含まれていると見なされるためです。
以下の例を見てみましょう。
using System;
class Program
{
static void Main()
{
string text = "こんにちは、世界!";
string searchString = ""; // 空文字列
bool contains = text.Contains(searchString); // 文字列が含まれているか確認
Console.WriteLine(contains); // 結果を表示
}
}
True
nullを検索した場合の挙動
String.Containsメソッド
にnull
を渡すと、ArgumentNullException
がスローされます。
これは、検索する文字列が無効であるためです。
以下の例では、null
を検索しています。
using System;
class Program
{
static void Main()
{
string text = "こんにちは、世界!";
string searchString = null; // nullを検索
try
{
bool contains = text.Contains(searchString); // 文字列が含まれているか確認
Console.WriteLine(contains); // 結果を表示
}
catch (ArgumentNullException e)
{
Console.WriteLine(e.Message); // エラーメッセージを表示
}
}
}
Value cannot be null. (Parameter 'value')
String.Containsメソッドの実例
単純な文字列検索の例
String.Containsメソッド
を使った単純な文字列検索の例です。
この例では、”プログラミング”という文字列に”ラ”が含まれているかを確認します。
using System;
class Program
{
static void Main()
{
string text = "プログラミング";
string searchString = "ラ"; // 検索する文字列
bool contains = text.Contains(searchString); // 文字列が含まれているか確認
Console.WriteLine(contains); // 結果を表示
}
}
True
大文字・小文字を区別した検索の例
次に、大文字・小文字を区別した検索の例を示します。
この例では、”CSharp”という文字列に”csharp”が含まれているかを確認します。
using System;
class Program
{
static void Main()
{
string text = "CSharp";
string searchString = "csharp"; // 小文字で検索
bool contains = text.Contains(searchString); // 文字列が含まれているか確認
Console.WriteLine(contains); // 結果を表示
}
}
False
複数のContainsメソッドを組み合わせた例
複数のContainsメソッド
を組み合わせて、複数の文字列が含まれているかを確認する例です。
この例では、”プログラミング”に”プログ”と”ミング”の両方が含まれているかをチェックします。
using System;
class Program
{
static void Main()
{
string text = "プログラミング";
bool containsBoth = text.Contains("プログ") && text.Contains("ミング"); // 両方の文字列が含まれているか確認
Console.WriteLine(containsBoth); // 結果を表示
}
}
True
特定の文字列が含まれているかを条件にしたif文の例
String.Containsメソッド
を使って、特定の文字列が含まれている場合に処理を行うif
文の例です。
この例では、”こんにちは、世界!”に”世界”が含まれているかを確認し、含まれていればメッセージを表示します。
using System;
class Program
{
static void Main()
{
string text = "こんにちは、世界!";
string searchString = "世界"; // 検索する文字列
if (text.Contains(searchString)) // 文字列が含まれているか確認
{
Console.WriteLine("「世界」が含まれています。"); // メッセージを表示
}
else
{
Console.WriteLine("「世界」は含まれていません。"); // メッセージを表示
}
}
}
「世界」が含まれています。
String.Containsメソッドの応用
大文字・小文字を無視した検索
String.Containsメソッド
はデフォルトで大文字・小文字を区別しますが、これを無視して検索する方法として、String.ToLower
またはString.ToUpperメソッド
を使用することができます。
以下の例では、”CSharp”に”csharp”が含まれているかを大文字・小文字を無視して確認します。
using System;
class Program
{
static void Main()
{
string text = "CSharp";
string searchString = "csharp"; // 小文字で検索
bool contains = text.ToLower().Contains(searchString.ToLower()); // 大文字・小文字を無視して確認
Console.WriteLine(contains); // 結果を表示
}
}
True
複数の文字列を同時に検索する方法
複数の文字列を同時に検索する場合、Containsメソッド
を組み合わせて使用することができます。
以下の例では、”プログラミング”に”プログ”または”ミング”のいずれかが含まれているかを確認します。
using System;
class Program
{
static void Main()
{
string text = "プログラミング";
bool containsEither = text.Contains("プログ") || text.Contains("ミング"); // いずれかの文字列が含まれているか確認
Console.WriteLine(containsEither); // 結果を表示
}
}
True
正規表現を使った高度な検索との違い
String.Containsメソッド
は単純な部分一致検索に特化していますが、正規表現を使用することで、より複雑なパターンマッチングが可能になります。
以下の例では、正規表現を使って”プログラミング”に”プログ”または”ミング”が含まれているかを確認します。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "プログラミング";
string pattern = "プログ|ミング"; // 正規表現パターン
bool matches = Regex.IsMatch(text, pattern); // 正規表現で確認
Console.WriteLine(matches); // 結果を表示
}
}
True
String.Containsと他の文字列検索メソッドの比較
String.Containsメソッド
は、文字列が含まれているかを確認するためのシンプルな方法ですが、他のメソッドと比較することでその特性を理解できます。
以下の表は、String.Contains
と他の文字列検索メソッドの違いを示しています。
メソッド名 | 説明 | 大文字・小文字の区別 |
---|---|---|
String.Contains | 指定した文字列が含まれているかを確認 | あり |
String.IndexOf | 指定した文字列が最初に出現するインデックスを返す | あり |
String.StartsWith | 文字列が指定した文字列で始まるかを確認 | あり |
String.EndsWith | 文字列が指定した文字列で終わるかを確認 | あり |
Regex.IsMatch | 正規表現に基づいて文字列がパターンに一致するかを確認 | あり |
このように、String.Contains
はシンプルで使いやすいですが、特定の条件やパターンマッチングが必要な場合は他のメソッドを検討することが重要です。
String.Containsメソッドのパフォーマンス
大規模な文字列に対する検索のパフォーマンス
String.Containsメソッド
は、文字列の長さに応じてパフォーマンスが変化します。
大規模な文字列に対して検索を行う場合、検索対象の文字列が長いほど、検索にかかる時間が増加します。
最悪の場合、文字列全体をスキャンする必要があるため、時間計算量はO(n)となります。
ここで、nは文字列の長さを表します。
したがって、大規模な文字列に対して頻繁に検索を行う場合は、パフォーマンスに注意が必要です。
String.Containsの内部動作
String.Containsメソッド
は、内部的には文字列を1文字ずつ比較することで動作します。
具体的には、検索対象の文字列の各文字を、元の文字列の各位置に対して比較し、一致する部分が見つかるまで続けます。
このため、文字列の長さや検索する部分文字列の長さによって、パフォーマンスが影響を受けます。
特に、部分文字列が長い場合や、元の文字列が非常に長い場合は、比較回数が増えるため、処理時間が長くなることがあります。
パフォーマンスを向上させるための工夫
String.Containsメソッド
のパフォーマンスを向上させるためには、以下のような工夫が考えられます。
工夫の内容 | 説明 |
---|---|
文字列の長さを短くする | 検索対象の文字列を短くすることで、比較回数を減らすことができる。 |
事前に文字列をキャッシュする | 同じ文字列に対して複数回検索を行う場合、結果をキャッシュして再利用する。 |
並列処理を利用する | 大規模な文字列に対しては、並列処理を利用して検索を行うことで、処理時間を短縮できる。 |
文字列のインデックスを作成する | 検索対象の文字列に対してインデックスを作成し、検索を高速化する。 |
String.Containsと正規表現のパフォーマンス比較
String.Containsメソッド
と正規表現を使用した検索のパフォーマンスを比較すると、一般的にString.Contains
の方が高速です。
これは、String.Contains
が単純な部分一致を行うのに対し、正規表現はパターンマッチングを行うため、より複雑な処理が必要になるからです。
以下の表は、両者のパフォーマンスの違いを示しています。
メソッド名 | パフォーマンス特性 | 使用シーン |
---|---|---|
String.Contains | 単純な部分一致で高速 | 簡単な文字列検索 |
Regex.IsMatch | 複雑なパターンマッチングで遅い | 複雑な条件やパターンの検索 |
このように、String.Contains
はシンプルで高速な検索が可能ですが、正規表現はより柔軟な検索ができるため、用途に応じて使い分けることが重要です。
String.Containsメソッドの注意点
大文字・小文字の区別に関する注意点
String.Containsメソッド
はデフォルトで大文字・小文字を区別します。
つまり、”Hello”と”hello”は異なる文字列として扱われます。
この特性を理解していないと、意図しない結果を得ることがあります。
大文字・小文字を無視して検索を行いたい場合は、ToLower
またはToUpperメソッド
を使用して、両方の文字列を同じケースに変換する必要があります。
文化依存の文字列比較に関する注意点
String.Containsメソッド
は、文化依存の文字列比較を行います。
これは、異なる文化や言語において文字列の比較が異なる場合があるためです。
たとえば、特定の言語では特定の文字が異なる扱いを受けることがあります。
文化に依存しない比較を行いたい場合は、StringComparison.Ordinal
を使用することを検討してください。
これにより、文化に依存しないバイナリ比較が行われます。
nullや空文字列を扱う際の注意点
String.Containsメソッド
にnull
を渡すと、ArgumentNullException
がスローされます。
したがって、検索する文字列がnull
でないことを確認する必要があります。
また、空文字列を検索した場合は常にtrue
が返されるため、意図しない結果を避けるために、空文字列の扱いにも注意が必要です。
空文字列を検索する場合は、特にその意味を明確にしておくことが重要です。
特殊文字やエスケープシーケンスの扱い
String.Containsメソッド
は、特殊文字やエスケープシーケンスを含む文字列を正しく扱いますが、これらの文字が含まれている場合は注意が必要です。
たとえば、改行文字やタブ文字などの特殊文字を検索する場合、正確にその文字を指定する必要があります。
以下の例では、改行文字を含む文字列を検索しています。
using System;
class Program
{
static void Main()
{
string text = "こんにちは\n世界!"; // 改行を含む文字列
string searchString = "\n"; // 改行文字を検索
bool contains = text.Contains(searchString); // 文字列が含まれているか確認
Console.WriteLine(contains); // 結果を表示
}
}
True
このように、特殊文字やエスケープシーケンスを扱う際は、正確に指定することが重要です。
特に、ユーザーからの入力を扱う場合は、これらの文字が含まれている可能性があるため、注意が必要です。
String.Containsメソッドの代替手段
String.IndexOfメソッドとの違い
String.IndexOfメソッド
は、指定した文字列が最初に出現するインデックスを返すメソッドです。
String.Contains
がbool型
を返すのに対し、String.IndexOf
はインデックスを返すため、部分文字列の位置を知りたい場合に便利です。
以下の例では、”プログラミング”に”ラ”が含まれているかを確認し、その位置を取得します。
using System;
class Program
{
static void Main()
{
string text = "プログラミング";
string searchString = "ラ"; // 検索する文字列
int index = text.IndexOf(searchString); // 文字列の位置を取得
if (index != -1) // -1は見つからなかったことを示す
{
Console.WriteLine($"'{searchString}'は位置{index}にあります。"); // 結果を表示
}
else
{
Console.WriteLine($"'{searchString}'は含まれていません。"); // 結果を表示
}
}
}
'ラ'は位置3にあります。
String.StartsWith/EndsWithメソッドとの違い
String.StartsWith
およびString.EndsWithメソッド
は、それぞれ文字列が指定した文字列で始まるか、または終わるかを確認するためのメソッドです。
これらは部分一致の特定のケースに特化しており、String.Contains
とは異なり、文字列の先頭または末尾に対する条件をチェックします。
以下の例では、”プログラミング”が”プログ”で始まるか、”ミング”で終わるかを確認します。
using System;
class Program
{
static void Main()
{
string text = "プログラミング";
bool startsWith = text.StartsWith("プログ"); // 先頭で始まるか確認
bool endsWith = text.EndsWith("ミング"); // 末尾で終わるか確認
Console.WriteLine($"先頭で始まる: {startsWith}"); // 結果を表示
Console.WriteLine($"末尾で終わる: {endsWith}"); // 結果を表示
}
}
先頭で始まる: True
末尾で終わる: True
正規表現を使った検索方法
正規表現を使用することで、より複雑なパターンマッチングが可能になります。
Regexクラス
を使用して、特定のパターンに一致する文字列を検索することができます。
以下の例では、”プログラミング”に”プログ”または”ミング”が含まれているかを正規表現で確認します。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "プログラミング";
string pattern = "プログ|ミング"; // 正規表現パターン
bool matches = Regex.IsMatch(text, pattern); // 正規表現で確認
Console.WriteLine(matches); // 結果を表示
}
}
True
LINQを使った文字列検索
LINQを使用して、文字列のコレクションに対して検索を行うこともできます。
Anyメソッド
を使用して、特定の条件を満たす要素が存在するかを確認することができます。
以下の例では、文字列の配列に”プログ”が含まれているかを確認します。
using System;
using System.Linq;
class Program
{
static void Main()
{
string[] texts = { "こんにちは", "プログラミング", "世界" };
string searchString = "プログ"; // 検索する文字列
bool contains = texts.Any(text => text.Contains(searchString)); // LINQで検索
Console.WriteLine(contains); // 結果を表示
}
}
True
このように、String.Containsメソッド
の代替手段として、さまざまな方法が存在します。
用途に応じて適切なメソッドを選択することが重要です。
よくある質問
まとめ
この記事では、C#のString.Containsメソッド
の基本的な使い方から、応用、パフォーマンス、注意点、代替手段まで幅広く解説しました。
特に、部分一致検索の便利さや、大文字・小文字の区別、文化依存の比較に関する注意点は、実際のプログラミングにおいて非常に重要な要素です。
これらの知識を活用して、より効率的な文字列操作を行うために、実際のプロジェクトでString.Containsメソッド
やその代替手段を試してみることをお勧めします。