文字列に特定の文字列が含まれているかを調べるには?(Contains編)[C#/VB、.NET 2.0]:.NET TIPS
.NET Framework 2.0で追加されたContainsメソッドを使うと、IndexOfメソッドよりも簡潔な形で、文字列に特定の文字列が含まれているかどうかを調べられる。
本稿は2006/02/17に初版公開した記事を改訂し、Visual Studio 2017でコードの動作検証、大文字小文字を区別せずに調べる方法と正規表現を使って調べる方法の追加、図版の追加、全般的な構成の変更などを行ったものです。
「TIPS:文字列に特定の文字列が含まれているかを調べるには?」で解説しているように、文字列に文字列が含まれているかどうかを調べるには、ある文字列内で部分文字列を検索してその位置を調べるためのStringクラス(System名前空間)のIndexOfメソッドを利用するのが一般的だった。
しかし.NET Framework 2.0のStringクラスには、文字列が含まれているかどうかを調べるための専用のメソッドであるContainsメソッドが追加されている。
特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。
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
なお、パラメーターに空文字列("")を指定した場合には、戻り値は常にtrueとなる。空の文字列はどのような文字列にも含まれるということである。これはIndexOfメソッドで空文字列の位置が常に0となるのと同様に、使用する際には注意が必要だ。
Containsメソッドは、内部的にはIndexOfメソッドを呼び出しているだけのようだが、もはや次のような条件式を書く必要がなくなるため、コードはすっきりし、その意味も明確になる。
if (str.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
このように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
利用可能バージョン:.NET Framework 2.0以降
カテゴリ:クラスライブラリ 処理対象:文字列
使用ライブラリ:Stringクラス(System名前空間)
関連TIPS:文字列に特定の文字列が含まれているかを調べるには?
関連TIPS:正規表現を使って文字列がパターンに一致するか調べるには?[C#/VB]
更新履歴
【2018/08/22】Visual Studio 2017でコードの動作検証、図版の追加、大文字小文字を区別せずに調べる方法と正規表現を使って調べる方法の追加、全般的な構成の変更などを行いました。
【2006/02/17】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.