連載
» 2018年08月22日 05時00分 公開

.NET TIPS:文字列に特定の文字列が含まれているかを調べるには?(Contains編)[C#/VB、.NET 2.0]

.NET Framework 2.0で追加されたContainsメソッドを使うと、IndexOfメソッドよりも簡潔な形で、文字列に特定の文字列が含まれているかどうかを調べられる。

[遠藤孝信, 山本康彦,共著]
「.NET TIPS」のインデックス

連載「.NET TIPS」

本稿は2006/02/17に初版公開した記事を改訂し、Visual Studio 2017でコードの動作検証、大文字小文字を区別せずに調べる方法と正規表現を使って調べる方法の追加、図版の追加、全般的な構成の変更などを行ったものです。


 「TIPS:文字列に特定の文字列が含まれているかを調べるには?」で解説しているように、文字列に文字列が含まれているかどうかを調べるには、ある文字列内で部分文字列を検索してその位置を調べるためのStringクラス(System名前空間)のIndexOfメソッドを利用するのが一般的だった。

 しかし.NET Framework 2.0のStringクラスには、文字列が含まれているかどうかを調べるための専用のメソッドであるContainsメソッドが追加されている。

POINT 文字列に特定の文字列が含まれているかを調べる方法

文字列に特定の文字列が含まれているかを調べる方法 文字列に特定の文字列が含まれているかを調べる方法


 特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。

Containsメソッドで簡潔に書くには?

 Containsメソッドは、含まれているかどうかを調べる文字列をパラメーターに指定し、文字列のインスタンスに対して呼び出す。戻り値はその有無を示すbool値(VBではBoolean値)となる。以下にそのサンプルプログラムを示す。Visual Studio 2017でVBプロジェクトを新規作成して、以下のコードを試す場合には、Mainプロシージャ内のコードをコピー&ペーストしてほしい。

// contains.cs

using System;

public class StringContains {
  static void Main() {
    string str = "ろうにゃくなんにょ";

    Console.WriteLine(str.Contains("にゃく")); // 出力:True
    Console.WriteLine(str.Contains("にゃん")); // 出力:False
    Console.WriteLine(str.Contains(""));       // 出力:True

    Console.WriteLine(str.IndexOf(""));        // 出力:0
  }
}

// コンパイル方法:csc contains.cs

' contains.vb

Imports System

Class StringContains
  Shared Sub Main()
    Dim str As String = "ろうにゃくなんにょ"

    Console.WriteLine(Str.Contains("にゃく")) ' 出力:True
    Console.WriteLine(Str.Contains("にゃん")) ' 出力:False
    Console.WriteLine(Str.Contains(""))       ' 出力:True

    Console.WriteLine(Str.IndexOf(""))        ' 出力:0
  End Sub
End Class

' コンパイル方法:vbc contains.vb

Containsメソッドを使用したサンプルプログラム(上:C#、下:VB)
contains.csのダウンロード
contains.vbのダウンロード

 なお、パラメーターに空文字列("")を指定した場合には、戻り値は常にtrueとなる。空の文字列はどのような文字列にも含まれるということである。これはIndexOfメソッドで空文字列の位置が常に0となるのと同様に、使用する際には注意が必要だ。

 Containsメソッドは、内部的にはIndexOfメソッドを呼び出しているだけのようだが、もはや次のような条件式を書く必要がなくなるため、コードはすっきりし、その意味も明確になる。

if (str.IndexOf(……) >= 0) {
  ……

IndexOfメソッドでは、その戻り値(文字列中で部分文字列が始まるインデックス)が0以上かどうかで特定の文字列が含まれているかを判断する必要がある

大文字小文字を区別せずに調べるには?

 アルファベットの大文字と小文字を区別せずに特定の文字列が含まれているかどうかを調べるには、残念ながらContainsメソッドは使えない。IndexOfメソッドを使い、パラメーターにStringComparison列挙型(System名前空間)のオプションを追加する(次のコード)。

string str = "ABCDEF";

Console.WriteLine(str.IndexOf("BCD", StringComparison.OrdinalIgnoreCase) >= 0);
// 出力:True
Console.WriteLine(str.IndexOf("bcd", StringComparison.OrdinalIgnoreCase) >= 0);
// 出力:True
Console.WriteLine(str.IndexOf("XYZ", StringComparison.OrdinalIgnoreCase) >= 0);
// 出力:False

Dim str As String = "ABCDEF"

Console.WriteLine(str.IndexOf("BCD", StringComparison.OrdinalIgnoreCase) >= 0)
' 出力:True
Console.WriteLine(str.IndexOf("bcd", StringComparison.OrdinalIgnoreCase) >= 0)
' 出力:True
Console.WriteLine(str.IndexOf("XYZ", StringComparison.OrdinalIgnoreCase) >= 0)
' 出力:False

大文字/小文字を区別せずに調べる例(上:C#、下:VB)
このようにStringComparison列挙型のオプションを追加できるのは、.NET Framework 2.0からである。

さらに複雑な条件で調べるには?

 複数の文字列を含むというような、さらに複雑な条件で調べたいことがある。そのときは、Containsメソッド/IndexOfメソッドを組み合わせたロジックを書いてもよいが、Regexクラス(System.Text.RegularExpressions名前空間)のIsMatchメソッドを使って正規表現で条件を与えると簡潔に書ける場合もある。

 例えば、「"吾輩は猫である"」または「"吾輩は犬である"」のどちらかの文字列が含まれているかどうかを検査するには、IsMatchメソッドを使って次のコードのように書ける。詳しくは「正規表現を使って文字列がパターンに一致するか調べるには?[C#/VB]」をご覧いただきたい。

Console.WriteLine(System.Text.RegularExpressions
                    .Regex.IsMatch("吾輩はである。名前はまだ無い。",
                                    "吾輩は(猫|犬)である"));
// 出力:True
Console.WriteLine(System.Text.RegularExpressions
                    .Regex.IsMatch("吾輩はである。名前はまだ無い。",
                                    "吾輩は(猫|犬)である"));
// 出力:True

Console.WriteLine(System.Text.RegularExpressions _
                    .Regex.IsMatch("吾輩はである。名前はまだ無い。",
                                    "吾輩は(猫|犬)である"))
' 出力:True
Console.WriteLine(System.Text.RegularExpressions _
                    .Regex.IsMatch("吾輩はである。名前はまだ無い。",
                                    "吾輩は(猫|犬)である"))
' 出力:True

正規表現を使って調べる例(上:C#、下:VB)

利用可能バージョン:.NET Framework 2.0以降
カテゴリ:クラスライブラリ 処理対象:文字列
使用ライブラリ:Stringクラス(System名前空間)
関連TIPS:文字列に特定の文字列が含まれているかを調べるには?
関連TIPS:正規表現を使って文字列がパターンに一致するか調べるには?[C#/VB]


更新履歴

【2018/08/22】Visual Studio 2017でコードの動作検証、図版の追加、大文字小文字を区別せずに調べる方法と正規表現を使って調べる方法の追加、全般的な構成の変更などを行いました。

【2006/02/17】初版公開。


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。