[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.Containsbool型を返すのに対し、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メソッドの代替手段として、さまざまな方法が存在します。

用途に応じて適切なメソッドを選択することが重要です。

よくある質問

String.Containsは大文字・小文字を区別しますか?

はい、String.Containsメソッドはデフォルトで大文字・小文字を区別します。

つまり、”Hello”と”hello”は異なる文字列として扱われます。

大文字・小文字を無視して検索を行いたい場合は、ToLowerまたはToUpperメソッドを使用して、両方の文字列を同じケースに変換する必要があります。

String.Containsで部分一致検索は可能ですか?

はい、String.Containsメソッドは部分一致検索を行うためのメソッドです。

指定した文字列が他の文字列に含まれているかを確認することができます。

たとえば、”プログラミング”という文字列に”プログ”が含まれているかを確認することができます。

String.Containsと正規表現のどちらを使うべきですか?

String.Containsと正規表現はそれぞれ異なる用途に適しています。

String.Containsは単純な部分一致検索に特化しており、使いやすく高速です。

一方、正規表現は複雑なパターンマッチングが可能で、特定の条件に基づいた検索が必要な場合に適しています。

用途に応じて、どちらを使用するかを選択することが重要です。

例えば、単純な文字列の存在確認にはString.Containsを、複雑なパターンの検索には正規表現を使用するのが良いでしょう。

まとめ

この記事では、C#のString.Containsメソッドの基本的な使い方から、応用、パフォーマンス、注意点、代替手段まで幅広く解説しました。

特に、部分一致検索の便利さや、大文字・小文字の区別、文化依存の比較に関する注意点は、実際のプログラミングにおいて非常に重要な要素です。

これらの知識を活用して、より効率的な文字列操作を行うために、実際のプロジェクトでString.Containsメソッドやその代替手段を試してみることをお勧めします。

  • URLをコピーしました!
目次から探す