DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字列内に指定された文字列があるか調べ、その位置を知る

ここでは、文字列(String)内に指定された文字列があるかを調べる方法と、その位置を知る方法を紹介します。

String.IndexOfメソッドを使う

String.IndexOfメソッドは、文字列内に指定した文字列と一致する部分があるかを探し、見つかったら、最初に見つかった位置を0以上の整数で返します。見つからなければ、-1を返します。

補足:「.NET Framework で文字列を使用するためのベスト プラクティス」では、後述するStringComparisonを指定してIndexOfメソッドを呼び出す方法を推奨しています。
補足:IndexOfメソッドで空白文字列を指定すると、0を返します。

以下に、IndexOfメソッドを使った例を示します。

VB.NET
コードを隠すコードを選択
Dim s1 As String = "あいうえおあいうえお"

Console.WriteLine(s1.IndexOf("うえ"))
'結果は"2"
Console.WriteLine(s1.IndexOf("ウエ"))
'結果は"-1"
Console.WriteLine(s1.IndexOf(""))
'結果は"0"
C#
コードを隠すコードを選択
string s1 = "あいうえおあいうえお";

Console.WriteLine(s1.IndexOf("うえ"));      //結果は"2"
Console.WriteLine(s1.IndexOf("ウエ"));      //結果は"-1"
Console.WriteLine(s1.IndexOf(""));          //結果は"0"

文字列内に指定された文字列があるかを調べるだけであれば、IndexOfメソッドが0以上の整数を返すかを調べるだけで十分です。

VB.NET
コードを隠すコードを選択
Dim str As String = "今日はいい天気です。"

'strに「天気」が含まれているか調べる
If 0 <= str.IndexOf("天気") Then
    Console.WriteLine("指定された文字列が含まれています")
Else
    Console.WriteLine("指定された文字列が含まれていません")
End If
C#
コードを隠すコードを選択
string str = "今日はいい天気です。";

//strに「天気」が含まれているか調べる
if (0 <= str.IndexOf("天気"))
{
    Console.WriteLine("指定された文字列が含まれています");
}
else
{
    Console.WriteLine("指定された文字列が含まれていません");
}

IndexOfメソッドには、検索の開始位置と範囲を指定できます。以下の例では、文字列内で一致する箇所をすべて探しています。

VB.NET
コードを隠すコードを選択
Dim s As String = "あいうえおあいうえお"
'検索する文字列
Dim searchWord As String = "うえ"

'始めの位置を探す
Dim foundIndex As Integer = s.IndexOf(searchWord)
While 0 <= foundIndex
    '見つかった位置を表示する
    Console.WriteLine(foundIndex)

    '次の検索開始位置
    Dim nextIndex As Integer = foundIndex + searchWord.Length
    If nextIndex < s.Length Then
        '次の位置を探す
        foundIndex = s.IndexOf(searchWord, nextIndex)
    Else
        '最後まで検索したときは終わる
        Exit While
    End If
End While
C#
コードを隠すコードを選択
string s = "あいうえおあいうえお";
//検索する文字列
string searchWord = "うえ";

//始めの位置を探す
int foundIndex = s.IndexOf(searchWord);
while (0 <= foundIndex)
{
    //見つかった位置を表示する
    Console.WriteLine(foundIndex);

    //次の検索開始位置
    int nextIndex = foundIndex + searchWord.Length;
    if (nextIndex < s.Length)
    {
        //次の位置を探す
        foundIndex = s.IndexOf(searchWord, nextIndex);
    }
    else
    {
        //最後まで検索したときは終わる
        break;
    }
}

IndexOfメソッドの代わりにLastIndexOfメソッドを使うこともできます。LastIndexOfメソッドは、文字列が最後に見つかった位置を返します。

VB.NET
コードを隠すコードを選択
Dim s1 As String = "あいうえおあいうえお"

Console.WriteLine(s1.LastIndexOf("うえ"))
'結果は"7"
Console.WriteLine(s1.LastIndexOf("ウエ"))
'結果は"-1"
Console.WriteLine(s1.LastIndexOf(""))
'結果は"9"
C#
コードを隠すコードを選択
string s1 = "あいうえおあいうえお";

Console.WriteLine(s1.LastIndexOf("うえ"));      //結果は"7"
Console.WriteLine(s1.LastIndexOf("ウエ"));      //結果は"-1"
Console.WriteLine(s1.LastIndexOf(""));          //結果は"9"
補足:VB.NETでは、IndexOfメソッドの代わりにInStr関数、LastIndexOfメソッドの代わりにInStrRev関数を使うこともできます。

大文字小文字の区別をしないで文字列が含まれているか調べる

.NET Framework 2.0からは、IndexOfメソッド(あるいは、LastIndexOfメソッド)にStringComparison値を渡すことで、大文字と小文字を区別するかを指定することができます。この時、StringComparisonの値によってカルチャに依存するかも決まります。

カルチャに依存しないで、序数による単純なバイト比較で探すには、Ordinalを指定します。序数で大文字小文字を区別しないで探すには、OrdinalIgnoreCaseを使用します。序数による方法はパフォーマンスに優れており、間違いが起こりにくいため、よく使われる方法です。

現在のカルチャを使用して探すのであればCurrentCultureを、現在のカルチャで大文字小文字を区別しないで探すにはCurrentCultureIgnoreCaseを使います。カルチャを使用した場合、厳密な比較が行われないため、思いもしなかった結果になる可能性があることに注意が必要です。

StringComparisonについてはさらに詳しく「2つの文字列が等しいかを調べる」で説明していますので、そちらをご覧ください。

補足:StringComparisonを指定しないでIndexOfメソッドを呼び出したときは、Stringを検索する場合はStringComparison.CurrentCultureが、Charを検索する場合はStringComparison.Ordinalが指定されたのと同じになります。このような紛らわしさを解消するためにも、「.NET Framework で文字列を使用するためのベスト プラクティス」では、StringComparisonを指定してIndexOfメソッドを呼び出すことを推奨しています。

以下の例では、カルチャに依存しない序数の並べ替え規則を使用して、大文字小文字を区別せずに文字列を探しています。

VB.NET
コードを隠すコードを選択
Dim s1 As String = "abcdefg"

'序数の並べ替え規則を使用して、大文字小文字の違いを無視して比較する
Console.WriteLine(s1.IndexOf("Def", StringComparison.OrdinalIgnoreCase))
'結果は"3"
C#
コードを隠すコードを選択
string s1 = "abcdefg";

//序数の並べ替え規則を使用して、大文字小文字の違いを無視して比較する
Console.WriteLine(s1.IndexOf("Def", StringComparison.OrdinalIgnoreCase));
//結果は"3"

CompareInfo.IndexOfメソッドを使って、半角全角、ひらがなカタカナの区別をしないで調べる

CompareInfoクラスのIndexOf、LastIndexOfメソッドを使えば、大文字小文字の区別だけでなく、全角と半角を区別しない比較や、ひらがなとカタカナを区別しない比較などを行うことができます。この方法は、.NET Framework 1.1以前でも使用できます。

どのような比較を行うかは、これらのメソッドに指定するCompareOptions値によって決まります。例えば、ひらがなとカタカナを区別しないならばIgnoreKanaTypeを、全角と半角を区別しないならばIgnoreWidthを指定します。CompareInfoクラスとCompareOptionsについては「2つの文字列が等しいかを調べる」で詳しく説明していますので、そちらをご覧ください。

以下に、ひらがなとカタカナを区別しない例と、全角と半角を区別しない例を示します。

VB.NET
コードを隠すコードを選択
Dim s1 As String = "あいうえおアイウエオ"

Dim ci As System.Globalization.CompareInfo = _
    System.Globalization.CultureInfo.CurrentCulture.CompareInfo

'ひらがなとカタカナを区別しない
Console.WriteLine( _
    ci.IndexOf(s1, "ウエ", System.Globalization.CompareOptions.IgnoreKanaType))
'結果は"2"

'半角と全角を区別しない
Console.WriteLine( _
    ci.IndexOf(s1, "ウエ", System.Globalization.CompareOptions.IgnoreWidth))
'結果は"7"
C#
コードを隠すコードを選択
string s1 = "あいうえおアイウエオ";

System.Globalization.CompareInfo ci =
    System.Globalization.CultureInfo.CurrentCulture.CompareInfo;

//ひらがなとカタカナを区別しない
Console.WriteLine(ci.IndexOf(s1, "ウエ",
    System.Globalization.CompareOptions.IgnoreKanaType));
//結果は"2"

//半角と全角を区別しない
Console.WriteLine(ci.IndexOf(s1, "ウエ",
    System.Globalization.CompareOptions.IgnoreWidth));
//結果は"7"

String.Containsメソッドを使う

文字列内に指定された文字列が含まれているかを調べるだけであれば、String.Containsメソッドも使えます。このメソッドは、.NET Framework 2.0以降でサポートされています。

String.Containsメソッドは、大文字小文字を区別する序数の比較を行います。つまり、String.IndexOfメソッドをStringComparison.Ordinalを使って呼び出し、戻り値が0以上か調べるのと同じです。

補足:String.Containsメソッドで空白文字列を指定すると、Trueを返します。
VB.NET
コードを隠すコードを選択
Dim s1 As String = "あいうえおあいうえお"

Console.WriteLine(s1.Contains("うえ"))   '結果は"True"
C#
コードを隠すコードを選択
string s1 = "あいうえおあいうえお";

Console.WriteLine(s1.Contains("うえ"));   //結果は"True"

文字列の先頭や末尾に指定された文字列があるか調べる

文字列の先頭や末尾に指定された文字列があるか調べるだけならば、String.StartsWithメソッドとString.EndsWithメソッドを使うと簡単です。

StartsWithメソッドは、その文字列が指定された文字列で始まるかどうかを調べ、その結果をBoolean値で返します。EndsWithメソッドは、指定された文字列で終わるかどうかを調べます。

補足:StartsWithとEndsWithメソッドで空白文字列を指定すると、Trueを返します。

StartsWithとEndsWithメソッドを使用した例を以下に示します。

VB.NET
コードを隠すコードを選択
Dim s1 As String = "あいうえおあいうえお"

Console.WriteLine(s1.StartsWith("あい"))    '結果は"True" 
Console.WriteLine(s1.StartsWith("アイ"))    '結果は"False" 
Console.WriteLine(s1.StartsWith(""))        '結果は"True" 

Console.WriteLine(s1.EndsWith("えお"))      '結果は"True" 
Console.WriteLine(s1.EndsWith(""))          '結果は"True" 
C#
コードを隠すコードを選択
string s1 = "あいうえおあいうえお";

Console.WriteLine(s1.StartsWith("あい"));   //結果は"True"
Console.WriteLine(s1.StartsWith("アイ"));   //結果は"False"
Console.WriteLine(s1.StartsWith(""));       //結果は"True"

Console.WriteLine(s1.EndsWith("えお"));     //結果は"True"
Console.WriteLine(s1.EndsWith(""));         //結果は"True"

IndexOfメソッドと同様に、.NET Framework 2.0からは、これらのメソッドにStringComparison値を渡すことで、大文字と小文字を区別するか、カルチャに依存するかを指定できます。なおStringComparison値を指定しなかったときは、StringComparison.CurrentCultureを指定したのと同じになります。

補足:「.NET Framework で文字列を使用するためのベスト プラクティス」では、StringComparisonを指定してStartsWithやEndsWithメソッドを呼び出すことを推奨しています。

また、CompareInfoクラスのIsPrefixとIsSuffixメソッドを使っても、StartsWithとEndsWithメソッドと同じことができます。こちらはCompareInfo.IndexOfメソッドと同様にCompareOptions値を指定できるため、ひらがなとカタカナ、全角と半角を区別しないで調べることができます。

以下にこれらのメソッドを使った例を示します。

VB.NET
コードを隠すコードを選択
Dim s1 As String = "abcde"

'大文字小文字を区別しないでStartsWithを使う
Console.WriteLine( _
    s1.StartsWith("ABC", StringComparison.CurrentCultureIgnoreCase))
'または、次のようにしても同じ
Console.WriteLine( _
    s1.StartsWith("ABC", True, System.Globalization.CultureInfo.CurrentCulture))
'結果は"True"

'大文字小文字を区別しないでEndsWithを使う
Console.WriteLine( _
    s1.EndsWith("CDE", StringComparison.CurrentCultureIgnoreCase))
'または、次のようにしても同じ
Console.WriteLine( _
    s1.EndsWith("CDE", True, System.Globalization.CultureInfo.CurrentCulture))
'結果は"True"

Dim s2 As String = "あいうえおアイウエオ"

Dim ci As System.Globalization.CompareInfo = _
    System.Globalization.CultureInfo.CurrentCulture.CompareInfo

'ひらがなとカタカナを区別しないで、StartsWithと同じことをする
Console.WriteLine( _
    ci.IsPrefix(s2, "アイ", System.Globalization.CompareOptions.IgnoreKanaType))
'結果は"True"

'全角と半角を区別しないで、StartsWithと同じことをする
Console.WriteLine( _
    ci.IsPrefix(s2, "アイ", System.Globalization.CompareOptions.IgnoreWidth))
'結果は"False"

'ひらがなとカタカナを区別しないで、EndsWithと同じことをする
Console.WriteLine( _
    ci.IsSuffix(s2, "うえお", System.Globalization.CompareOptions.IgnoreKanaType))
'結果は"True"

'全角と半角を区別しないで、EndsWithと同じことをする
Console.WriteLine( _
    ci.IsSuffix(s2, "ウエオ", System.Globalization.CompareOptions.IgnoreWidth))
'結果は"True"
C#
コードを隠すコードを選択
string s1 = "abcde";

//大文字小文字を区別しないでStartsWithを使う
Console.WriteLine(
    s1.StartsWith("ABC", StringComparison.CurrentCultureIgnoreCase));
//または、次のようにしても同じ
Console.WriteLine(
    s1.StartsWith("ABC", true, System.Globalization.CultureInfo.CurrentCulture));
//結果は"True"

//大文字小文字を区別しないでEndsWithを使う
Console.WriteLine(
    s1.EndsWith("CDE", StringComparison.CurrentCultureIgnoreCase));
//または、次のようにしても同じ
Console.WriteLine(
    s1.EndsWith("CDE", true, System.Globalization.CultureInfo.CurrentCulture));
//結果は"True"

string s2 = "あいうえおアイウエオ";

System.Globalization.CompareInfo ci =
    System.Globalization.CultureInfo.CurrentCulture.CompareInfo;

//ひらがなとカタカナを区別しないで、StartsWithと同じことをする
Console.WriteLine(
    ci.IsPrefix(s2, "アイ", System.Globalization.CompareOptions.IgnoreKanaType));
//結果は"True"

//全角と半角を区別しないで、StartsWithと同じことをする
Console.WriteLine(
    ci.IsPrefix(s2, "アイ", System.Globalization.CompareOptions.IgnoreWidth));
//結果は"False"

//ひらがなとカタカナを区別しないで、EndsWithと同じことをする
Console.WriteLine(
    ci.IsSuffix(s2, "うえお", System.Globalization.CompareOptions.IgnoreKanaType));
//結果は"True"

//全角と半角を区別しないで、EndsWithと同じことをする
Console.WriteLine(
    ci.IsSuffix(s2, "ウエオ", System.Globalization.CompareOptions.IgnoreWidth));
//結果は"True"

正規表現やLike演算子を使う

正規表現を使えば、ある文字列が指定したパターンと一致しているかを調べることができます。詳しくは、「正規表現を使って文字列を検索し、抽出する」をご覧ください。

VB.NETでは、Like演算子を使って、ある文字列が指定したパターンと一致しているかを調べることができます。正規表現のように複雑ではなく、ファイルのパターンマッチでおなじみの"*"や"?"などを使用しますので、お手軽です。詳しくは、MSDNの「Like 演算子」などをご覧ください。

  • 履歴:
  • 2012/3/12 「String.Containsメソッドは、大文字小文字を区別しない序数の比較を行います」となっていたのを「String.Containsメソッドは、大文字小文字を区別する序数の比較を行います」に修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。